索引失效的坑要点
- 索引列上套函数:WHERE YEAR(create_time) = 2026 会失效
- 索引列参与运算:WHERE amount + 1 = 100 索引失效
- 前导通配:LIKE '%明' 开头模糊,索引用不上
- 隐式类型转换:phone 是字符串却传数字会失效
- OR 连了非索引列,整条可能退化成全表扫
- 不满足最左前缀,组合索引只用了后面几列
- 数据量太小,优化器觉得全表扫更划算
索引失效的坑示例
-- 失效:在索引列上包函数
SELECT * FROM order_record WHERE YEAR(create_time) = 2026;
-- 失效:前导通配
SELECT * FROM user WHERE user_name LIKE '%明';
-- 失效:字符串列传了数字(隐式转换)
SELECT * FROM user WHERE phone = 13800138000;
-- 生效:后缀通配,能用上索引
SELECT * FROM user WHERE user_name LIKE '张%';
避坑提醒:索引列在 WHERE 里要保持「干净」:不套函数、不运算、不隐式转换,原样参与比较才走得通。