• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Mysql5.7及8.0版本索引失效情况汇总

MySql 海叔叔 19小时前 7次浏览 已收录 0个评论

TIPS:
1、没有特殊说明,测试环境均为MySQL8.0,早期版本可能会有更多情况导致索引失效。8.0失效的情况,早期版本也失效;8.0不失效的情况,早期版本可能失效。
2、所有测试默认不考虑表为空的情况,特殊情况文中会有说明。
3、本文只介绍Innodb引擎下的索引失效情况。

一个独立索引

1、使用like且在左边有“%”。

2、隐式类型转换,索引字段与条件或关联字段的类型不一致。

3、条件中对索引列进行运算或使用函数

4、不可空索引使用 is not null,仅当查询列只有该索引列时会使用索引

5、使用OR且存在非索引列

6、使用 NOT IN、IN、IS NULL、IS NOT NULL,且返回值中不止包含条件索引列。

7、使用非主键范围条件查询时,部分情况索引失效。

8、MySQL5.7,使用 IS NOT NULL或 IS NULL 部分情况下索引失效。

9、MySQL5.7,使用 != 或 IN 或 NOT IN 且返回值不只有索引列

10、MySQL5.7,表关联时,关联字段字符集不一致会导致索引失效。

11、MySQL5.7,表关联时,关联字段字符集排序规则不一致会导致索引失效。

2、多个独立索引

1、使用OR且第一个条件是范围查询,且返回值中不止包含条件索引列。

2、 MySQL5.7,使用OR且存在条件是范围查询,且返回值中不止包含条件索引列。

3、组合索引

总结
1、所有简单查询(执行计划中 select_type = simple),只要where条件中有索引列(无论什么条件),且返回值中只包含该索引列,都会用到索引。根据执行计划中的extra可以区分索引的用途:
1、extra = Using index,表示索引覆盖。
2、extra = Using index, Using where,表示该索引是用于查其他索引键值。此时会增加IO次数,查询速度会有所下降。

在复制其他地方提供的sql建表脚本时,注意其字符集和排序规则是否跟自己数据库默认的一致,否则可能出现索引失效的问题。

不同版本不同情况下,索引的使用情况不一致。上文提到的可能使用可能不使用的情况是由MySQL的优化器决定的,可能还会有其他情况下优化器也不使用索引,此时我们可以强制指定需要使用的索引:


喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址