由于索引问题经常在面试中问到,今天对索引进行一个系统的总结。
索引是对数据库表中一列或多列的值进行排序的一种结构。是一个单独的、存储在磁盘上的数据库结构,包含着对数据库表里所有记录的引用指针。
通过创建唯一索引,可以保证数据库表中每一行数据的唯一性
大大加快了查询速度
在使用分组和排序子句进行数据查询时,可以减少查询中分组和排序的时间
创建和维护索引需要耗费时间
索引占用额外的存储空间
降低了插入、删除、更新的效率
普通索引:允许在定义索引列中插入重复值和空值
唯一索引:允许有空值,但值必须唯一 【主键索引不允许有空值】
单列索引:一个索引只包含单列
组合索引:表中多个字段组合上创建的索引,遵循最左前缀集合
定义:在定义索引的列上支持值的全文查找,允许插入重复值和空值
适用范围:希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。
在使用全文索引的时候有几个注意事项:
对空间类型的字段建立的索引
空间类型:geometry、point、linestring、polygon
1、并非越多越好:一个表中有大量索引不仅占用较大的磁盘空间,还会影响插入、删除、更新的性能
2、避免对经常更新的表进行过多的索引,并且索引中的列尽可能小
3、数据量小的表最好不要使用索引:查询花费的时间可能比遍历索引的时间还要短
4、在频繁进行排序或分组的列上建立索引
5、当唯一性是某种数据本身的特征时,指定唯一索引
(1)聚簇索引:并不是一种单独的索引类型,而是一种数据存储方式(B+树),将数据存储与索引放到了一块,找到索引也就找到了数据。
(2)非聚簇索引:其叶子节点并不包含行记录的全部数据,除了包含键值外,还包含了相应行数据的聚簇索引键。
首先根据组合索引中最左边的、也就是第一个字段进行排序,在第一个字段排序的基础上,再对组合索引中后面的第二个字段进行排序,依此类推。
对于联合索引,MySQL 会一直向右匹配直到遇到范围查询(> , < ,between,like)就停止匹配。比如 a = 3 and b = 4 and c > 5 and d = 6,如果建立的是(a,b,c,d)这种顺序的索引,那么 d 是用不到索引的,但是如果建立的是 (a,b,d,c)这种顺序的索引的话,那么就没问题,因为范围查询c是最后一个。
= 和 in 可以乱序,比如 a = 3 and b = 4 and c = 5 建立 (a,b,c)索引可以任意顺序。
如果建立的索引顺序是 (a,b)那么直接采用 where b = 5 这种查询条件是无法利用到索引的。