索引失效的情况

索引失效是指在查询中虽然建立了索引,但 MySQL 优化器认为全表扫描比走索引更划算,或者由于语法原因导致索引无法被利用。常见情况如下:

违背最左前缀原则

在复合索引 (a, b, c) 中,如果查询条件不包含最左列 a(如只查 b 或 c),索引将失效。

如果前导列使用了范围查询(如 WHERE a > 10 AND b = 1),则后续列 b 无法利用索引的有序性。

在索引列上做计算或函数操作

WHERE age + 1 = 20 或 WHERE UPPER(name) = 'TOM' 会导致索引失效,因为索引树是基于原始列值构建的。

隐式类型转换

字段是字符串类型,但查询时未加引号(如 WHERE phone = 13800),MySQL 会将字符串转为数字进行比较,导致索引失效。

模糊查询前置通配符

LIKE '%abc' 会导致索引失效,因为无法确定起始位置;而 LIKE 'abc%' 可以走索引范围扫描。

OR 连接中存在无索引列

WHERE id = 1 OR name = 'tom',如果 name 没有索引,则整个查询会放弃使用 id 索引。

负向查询与不等于

!=、<>、NOT IN 等在某些数据分布下会导致索引失效(优化器判断全表扫描更快)。

数据区分度过低

如性别、逻辑删除状态位等。优化器认为“索引 + 回表”的代价高于全表扫描。

一句话总结:索引失效多由违背最左前缀、在索引列上进行函数计算或类型转换、使用前置通配符模糊查询以及 OR 两侧未全覆盖索引等原因引起。

#牛客AI配图神器#
全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务