索引失效场景
当使用索引列进行查询时,最终会到主键索引树查询对应的数据进行返回,理论上来说使用了索引列查询,能很好的提高查询效率,但是不规范的使用,会使索引失效。
1. 索引列使用函数
在索引列上做运算,比如使用函数,会导致mysql无法识别索引列,查询的时候就不会走索引了。不过mysql8开始,增加了索引函数来解决这个问题。
2. 不按照组合索引的顺序查询
在一个由多列构成的组合索引中,按照最左匹配原则,从索引的最左列开始顺序检索,否则不走索引。
在组合索引中,索引的存储结构是按照索引的顺序来存储的,因此在sql中也需要按照这个顺序来进行匹配,否则InnoDB无法识别索引导致索引失效。
有个特殊情况,比如表table中存在a,b两个列的组合索引,在查询时使用where b=1 and a=1进行查询时,虽然没有按照a,b的顺序进行查询,但是还是会走索引。MySQL的查询优化器会尝试找到最有效的索引使用方式。因此,即使你的查询条件是 where b=1 and a=1
,MySQL仍然可以使用 (a, b)
索引来加速查询。
3. 隐式转换不走索引
当存在隐式转换的时候,比如索引列是字符串类型,但是查询的时候没有使用引号,mysql会自动进行类型转换,导致索引失效。
4. 在索引列使用!= 或者 not的时候
在索引列使用不等于号、not查询的时候,由于索引检索的效率会非常低,因此mysql引擎判断不走索引。
5. like通配符匹配后缀%xxx
索引列使用like通配符匹配后缀%XX的时候,由于不符合索引的最左匹配原则,所以也不走索引。但是反过来,如果通配符匹配的是前缀XXX%,符合最左匹配原则,则是走索引的。
6. 使用or连接查询的时候
在使用or查询的时候,如果or语句前后没有同时使用索引,那边索引也会失效。只有当or语句前后列都是索引列的时候,索引才会生效。
除了这些场景之外,对于多表连接查询的情况,连接顺序也会影响索引的使用。
索引不适合哪些场景
1. 数据量少的情况不适合建立索引
2. 更新非常频繁的情况不适合添加索引
3. 区分度低的列不适合添加索引(比如性别等)
标签:顺序,Mysql,查询,索引,时候,使用,失效 From: https://blog.csdn.net/weixin_40954799/article/details/140864135