索引失效是慢查询里最常见的原因之一。下面几个场景是我在真实项目里反复遇到的。
1. 隐式类型转换
-- phone 是 varchar,这里会全表扫描
SELECT * FROM users WHERE phone = 13800138000;
-- 正确写法
SELECT * FROM users WHERE phone = '13800138000';
字段和传入值的类型不一致时,MySQL 会把字段转成数字比较,索引直接废掉。
2. 最左前缀被破坏
联合索引 (a, b, c) 能命中 a、a,b、a,b,c,但 b、b,c 不行。
3. 索引列上做运算或函数
WHERE DATE(created_at) = '2026-09-01' 和 WHERE amount * 2 > 100 都吃到过教训,改成范围条件即可。
4. 前导模糊匹配
LIKE '%关键字' 无法使用 B+ 树索引。数据量大的话考虑全文索引或搜索引擎。
5. OR 连接了没索引的列
只要 OR 的一侧没有索引,整个条件就可能退化成全表扫描。
怎么快速确认
EXPLAIN 看 type 和 key 两列基本够了,重点排查 type=ALL 的语句。养成上线前跑一遍慢查询日志的习惯,比出事之后再优化轻松得多。