
"加索引"是性能优化面试题的标准答案,但更能体现功底的是回答"为什么这条 SQL 没有走索引"。这篇文章整理了实际项目和毕设答辩中最常遇到的索引失效场景。
一、隐式类型转换
当查询条件的字段类型与索引字段类型不一致时(如字符串字段用数字查询),MySQL 会对索引字段做隐式类型转换,导致索引失效。
二、对索引列使用函数或运算
-- 索引失效:对索引列做了函数运算
SELECT * FROM orders WHERE YEAR(created_at) = 2025;
-- 优化后:改为范围查询,索引生效
SELECT * FROM orders
WHERE created_at >= '2025-01-01' AND created_at < '2026-01-01';三、不满足最左前缀原则
联合索引 (a, b, c) 只有在查询条件包含 a,或 a 和 b 时才能有效利用索引;如果查询条件只有 b 或 c,索引无法生效。这是面试中最常被追问的知识点之一,建议结合 EXPLAIN 的 key_len 字段来直观理解。
- 模糊查询 LIKE "%关键词" 前置通配符会导致索引失效
- OR 连接的条件如果有一侧没有索引,可能导致整个查询走全表扫描
- 数据分布不均匀时,优化器可能判断走索引代价更高而放弃索引(索引选择性差)
- 隐式字符集转换(如 utf8 与 utf8mb4 混用)也会导致索引失效
四、排查方法
善用 EXPLAIN 分析执行计划,重点关注 type(访问类型)、key(实际使用的索引)、rows(预估扫描行数)三个字段。答辩或面试时如果能展示优化前后的 EXPLAIN 对比截图,会是很有说服力的加分项。
#MySQL#索引优化#SQL调优



