MySQL中使用索引一定有效吗?如何排查索引效果?
MySQL中使用索引一定有效吗?如何排查索引效果?
一、不一定一定有效,以下是索引失效的几种情况
- 使用了联合索引却不符合最左匹配原则
- like模糊匹配的随意使用,比如占位符放在最左端
- or的随意使用,当只有一个索引,or连接了两个条件,那么索引就失效了
- 将表中的两个不同字段进行比较,如 age > id
- 使用了order by,order by 后面如果不是主键或者覆盖索引,会导致不走索引
- 索引中使用了运算
- 索引中使用了函数
- 随意的字段类型的使用,比如varchar类型字段用int来给予条件,mysql内部会对其进行数据类型转换,这个过程会使用函数,索引会失效;还有就是不同编码表的联表查询也会导致隐式字符编码转换,也会使用函数,索引失效
- 不同参数也会导致索引失效,不同的参数会导致mysql评估成本不一致,有时候会选择索引,有时候会选择全表扫描,特别是在复杂查询的时候。
二、使用explain排查索引效果
- type:访问类型
- ALL :全表查询,没有使用索引
- index:全索引扫描,对覆盖索引的全扫描(全扫描二级索引)
- range:索引检索给定范围的行(通过索引快速扫描)
- key:使用的索引,会显示索引的名称,如果值是NULL,就表示没有使用索引
- rows:扫描的行数