加了索引不代表一定会走。这篇把最常见的索引失效场景讲清楚。
一、常见失效场景
-- 1. 对索引列使用函数WHEREDATE(create_time)='2026-07-24'-- ❌WHEREcreate_time>='2026-07-24'-- ✅ANDcreate_time<'2026-07-25'-- 2. 隐式类型转换WHEREphone=1234567890-- ❌ phone 是 varcharWHEREphone='1234567890'-- ✅-- 3. LIKE 以 % 开头WHEREnameLIKE'%张三%'-- ❌(以%开头不走)WHEREnameLIKE'张三%'-- ✅(以常量开头走)-- 4. OR 条件中有未索引列WHEREname='张三'ORage=25-- ❌ age 无索引WHEREname='张三'ANDage=25-- ✅-- 5. 联合索引跳过最左列-- 索引(a,b,c)WHEREb=1ANDc=2-- ❌ 跳过了 aWHEREa=1ANDc=2-- ✅ a 走索引,c 不走-- 6. != 或 <> 操作WHEREstatus!=1-- ❌ 不等于不走索引WHEREstatusIN(0,2)-- ✅-- 7. IS NULL / IS NOT NULLWHEREnameISNOTNULL-- ❌ 大部分数据非空时不走二、怎么判断
EXPLAINSELECT*FROMuserWHEREphone='13800000000';-- type = ref → 走索引 ✅-- type = ALL → 没走索引 ❌💡 觉得有用的话,点赞 + 关注【张老师技术栈】吧!每周更新 Java/Python/MySQL 实战干货,不让你白来。