索引失效的情况
索引失效是指在查询中虽然建立了索引,但 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配图神器#
违背最左前缀原则
在复合索引 (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配图神器#
全部评论
相关推荐
点赞 评论 收藏
分享
查看8道真题和解析 点赞 评论 收藏
分享

