索引就像是书的目录,是与表或视图关联的磁盘上结构,能够加快从表或视图中检索行的速度。索引中包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(BTree)中,使SQL能够快速有效地查找与键值关联的行。数据库
① 创建索引的列能够保证行的惟一性,生成惟一的rowId测试
② 创建索引能够有效缩短数据的检索时间优化
③ 创建索引能够加快表与表之间的链接排序
④ 为用来排序或者是分组的字段添加索引能够加快分组和排序顺序索引
① 建立索引和维护索引须要时间成本,这个成本随着数据量的增长而加大内存
② 建立索引和维护索引须要空间成本,每一条索引都要占据数据库的物理存储空间,数据量越大,占用空间也越大(数据表占据的是数据库的数据空间)字符串
③ 会下降表的增删改的效率,由于每次增删改索引须要进行动态维护,致使时间变长效率
① 总的来讲就是数据量大的,常常进行查询操做的表要创建索引原理
② 表中字段创建索引应该遵循几个原则:搜索
1) 越小的数据类型一般更好:越小的数据类型一般在磁盘、内存中都须要更少的空间,处理起来更快。
2) 简单的数据类型更好:整型数据比起字符,处理开销更小,由于字符串的比较更复杂,处理起来也更耗时。
3)尽可能避免NULL:应该指定列为NOT NULL。含有空值的列很难进行查询优化,由于它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
4) 对非惟一的字段,例如“性别”这种大量重复值的字段,增长索引也没有什么意义,因此索引的创建应当更多的选取惟一性更高的字段。
③ 表与表链接用于多表联合查询的约束条件的字段应当创建索引
④ 用于排序的字段能够添加索引,用于分组的字段应当视状况看是否须要添加索引。
⑤ 添加多列索引的时候,对应的多条件查询能够触发该索引的同时,索引最左侧的列的单条件查询也能够触发。
⑥ 若是有些表注定只会进行查询全部,也就不必添加索引,由于查询所有只能进行全量搜索即扫描全表。
索引的原理大体归纳为以空间换时间,数据库在未添加索引的时候进行查询默认的是进行全量搜索,也就是进行全局扫描,有多少条数据就要进行多少次查询,而后找到相匹配的数据就把他放到结果集中,直到全表扫描完。而创建索引以后,会将创建索引的KEY值放在一个n叉树上(BTree)。由于B树的特色就是适合在磁盘等直接存储设备上组织动态查找表,每次以索引进行条件查询时,会去树上根据key值直接进行搜索,次数约为log总条数,底数为页面存储数,例如一个100万数据的表,页面存储数为100,那么有索引的查询次数为3次log1000000100,可是全量搜索为100万次搜索,这种方式相似于二分法,可是这个是n分法。
一个表有字段A、B、C,同时进行插入10000行记录测试
在没有建索引时平均完成时间是2.9秒
在对A字段建索引后平均完成时间是6.7秒
在对A字段和B字段建索引后平均完成时间是10.3秒
在对A字段、B字段和C字段都建索引后平均完成时间是11.7秒
从以上测试结果能够明显看出索引对数据修改产生的影响