索引失效总结
即使建立了索引,SQL 写法不当也会导致全表扫描。
1. 使用函数或计算
-- 错误:导致索引失效
SELECT * FROM user WHERE YEAR(create_time) = 2025;
-- 正确:使用范围查询
SELECT * FROM user WHERE create_time >= '2025-01-01' AND create_time < '2026-01-01';2. 隐式类型转换
-- phone 字段为 varchar,传入数字会导致类型转换
SELECT * FROM user WHERE phone = 13800138000; -- 索引失效3. LIKE 以 % 开头
SELECT * FROM user WHERE name LIKE '%张三%'; -- 失效
SELECT * FROM user WHERE name LIKE '张三%'; -- 有效4. OR 条件中部分字段无索引
-- 如果 age 无索引,整个查询走全表
SELECT * FROM user WHERE id = 1 OR age = 20;5. 复合索引未遵循最左前缀
复合索引 (a, b, c),查询条件只有 b 或 c 时失效。
6. != 或 <>
SELECT * FROM user WHERE status != 0; -- 多数情况失效7. 对索引列进行 NULL 判断
is null 可能有效,is not null 通常失效。
8. 数据分布不均
如果表中 90% 的数据满足条件,优化器可能选择全表扫描。
排查工具:使用 EXPLAIN 查看 type 是否为 ALL 或 index。
