Mysql索引

在MySQL中,索引也叫做“键”,常用的数据结构为B+树,查询时的时间复杂度为O(logn),所以可以高效获取数据,优于时间复杂度为O(n)的全表查询。索引根据被索引列的不同分为单列索引多列索引

单列索引只包含单个列;多列索引包含多个列,又称为联合索引,组合索引,复合索引,使用多列索引时遵循最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。一个表中可以有多个索引。

单列索引和多列索引都可以设置唯一属性。主键索引是特殊的唯一索引,它的特点就是不允许有空值且一张表中只允许创建一个主键索引。添加了唯一属性的索引我们称之为唯一索引,如果该索引被设置为了主键,则称之为主键索引。既没有设置唯一属性,也不是主键的则为普通索引

索引的设计是项目开发中不可或缺的环节,是mysql查询性能提升的关键,以下几种情况会导致
索引失效

  1. 未使用索引列进行查询

  2. 复合索引未用左列字段或查询的条件中的列的顺序与索引顺序不一致

  3. like以%开头

  4. where中索引列有运算(计算,使用函数,类型不匹配需要转换,包含了IS NULL或IS NOT NULL等)

  5. or会使索引失效。如果查询字段相同,也可以使用索引。例如where A=a1 or A=a2(生效),where A=a or B=b(失效)

创造索引建议

  1. 推荐:频繁作为查询条件的字段

  2. 推荐:查询中与其它表关联的字段

  3. 推荐:查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

  4. 推荐:查询中统计或者分组字段

  5. 推荐:使用组合索引,创建a_b_c索引,相当于同时创建了 a,a_b,a_b_c三个索引

  6. 不推荐:经常增删改的表不要创建过多索引,更新数据的时候,也需要更新索引,索引太多,在更新索引的时候会造成负担

  7. 不推荐:where条件里用不到的字段

  8. 不推荐:有大量重复数据的列

  9. 不推荐:不会产生太多记录的表

  10. 不建议:使用无序的值作为索引

  11. 不建议:在使用场景中必然会导致索引失效的列

除了上述索引,还有不常用到的hash索引全文索引

hash索引仅支持Memory引擎 ,是一种关联数组的数据结构。适用于等值查询,时间复杂度为O(1);
如果进行范围查询,时间复杂度会退化为O(n);hash索引无法保证数据的顺序性,在ORDER BY的情况下,使用Hash索引还需要对数据重新排序;也不支持模糊查询。如果遇到Hash冲突时,则处理更为耗时。

全文索引从Mysql5.6版本之后也支持InnoDB引擎,之前仅支持Myisam,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,全文索引就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行。项目中通常不会使用 mysql 提供的全文索引,而是使用Sphinx插件或者ELK全家桶(Elasticsearch +logstash+kibana),轻需求用Sphinx,重需求用ELK。


未完待续
有关mysql索引的相关内容都将在本文中更新

欢迎讨论

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

索引失效场景:

  • 隐式的类型转换
  • 查询条件包含or
  • like通配符可能导致索引失效
  • 查询条件不满足联合索引的最左匹配原则
  • 在索引列上使用内置函数
  • 对索引列进行运算
  • 索引字段上使用 ! = 或者< >
  • 索引字段上使用is null, is not null或者索引字段的值为null
  • 联查时关联的字段编码格式不一样
5个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!