Mysql 索引的使用 如何避免索引失效
文章目录
1, 全值匹配
对索引中所有列都指定具体值,这时,索引生效,执行效率高
2,最左前缀法则
如果建立了复合索引,要遵守最左前缀法则。指的是查询要从索引的最左前列开始,索引的列可以不全用,但是不能跳过索引中的列
下面是示例
可以看见三种情况下,索引都生效
但是,如果没有第一列的name字段,是不会使用索引的
注意:这里的最左前缀,指的是查询条件是否包含,而与where后的字段顺序无关,下面这张图作为验证
如果where后的条件包含的字段不是连续的,则使用复合索引中连续的从左边开始的部分索引
如下图,索引是(name,status,address),跳过了status字段,包含address,但explain分析后,查询时只使用了name索引
3,范围查询,右边的列,不能使用索引
如下图所示,第一次索引长度为813,使用name、status和address复合索引
第二次,使用范围查询,索引右边的address字段将不算在索引范围内,只使用name索引,长度410
4,在某一列上使用了运算操作,索引将失效
5,字符串不加单引号,造成索引失效
6,尽量使用覆盖索引,避免select *
尽量使用覆盖索引(只访问索引的查询(索引列完全包含查询列)),减少select *
可以看见第一次select的部分字段不在索引内,所以最终需要回表查询
| 关键词 | 含义 |
|---|---|
| using index | 使用覆盖索引的时候会出现 |
| using where | 在查找使用索引的情况下,需要回表去查询所需的数据 |
| using index condition | 查找使用了索引,但是需要回表查询数据 |
| using index | 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据 |
7,用or分割的条件
如果or前面的条件用了索引,or后面的条件没有使用索引,整个查询将不会使用索引
可以看见,使用or时,索引失效,改为and连接,则会使用索引
8,以%开头的like模糊查询,索引失效
如果是尾部模糊查询,索引不会失效,如果是头部模糊匹配,索引失效
但是%XXX%形式的模糊查询又非常实用
解决方案:
实用覆盖索引:将select * 改为 select sellerid,name,status,address 等建立了索引的字段
由图可知,使用覆盖索引后,%XXX%形式的模糊查询又会使用索引了
9,如果MySQL评估使用索引比全表扫描更慢,则不使用索引
第一句是建立索引,后面两次查询可知,特殊情况下(查询字段占比特别大),MySQL查询将不使用索引