MySQL索引失效分析:面试官最常挖的坑
程序员面试中,MySQL索引失效几乎是必考题。明明建了索引,查询速度却像蜗牛爬,面试官就爱拿这种场景刁难人。今天咱们就掰开揉碎说说索引失效的七大经典场景,全是血泪教训总结!

👉 顺手分享个干货:2025年最新Java面试题库已更新,包含MySQL高频考点: 链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
索引失效的7大死亡陷阱
1. 索引列玩计算游戏
当你在WHERE子句中对索引列做计算或函数操作时,MySQL直接放弃治疗:
SELECT * FROM users WHERE YEAR(create_time) = 2023 -- 索引失效!
应该写成:
SELECT * FROM users WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'
2. 索引列隐式类型转换
常见于字符串与数字混用场景:
SELECT * FROM orders WHERE user_id = '10086' -- user_id是整型?索引挂!
MySQL内部做了类型转换,相当于CAST(user_id AS CHAR),直接导致索引失效。
3. 模糊查询耍流氓
通配符打头阵的LIKE语句是索引杀手:
SELECT * FROM products WHERE name LIKE '%苹果%' -- 全表扫描警告!
解决方案:改用后缀匹配苹果%或上全文索引。
4. OR连接非索引列
当OR连接的条件中有非索引列时,整个查询崩盘:
SELECT * FROM logs
WHERE id = 10086 OR content = 'error' -- content无索引?全表扫!
5. 联合索引左匹配缺失
建了(a,b,c)联合索引,却跳过a直接查b:
SELECT * FROM table WHERE b = 1 AND c = 2 -- 索引:你在叫我?
这就好比用手机号后四位查人——没戏!
6. 索引列使用NOT或!=操作
负向查询是索引的克星:
SELECT * FROM orders WHERE status != 1 -- 宁可全表扫也不走索引
7. 数据分布太极端
当MySQL发现索引列值重复率超高时(比如性别字段):
SELECT * FROM users WHERE gender = '男' -- 90%都是男?索引说告辞
优化器直接选择全表扫描更省事。
急救你的索引失效问题
-
用EXPLAIN照妖镜
执行前先用EXPLAIN看执行计划,观察key和type字段是否命中索引 -
强制索引试试水
特殊场景可用FORCE INDEX救命:SELECT * FROM orders FORCE INDEX(idx_status) WHERE status = 1 -
覆盖索引大法
只查索引包含的列,避免回表:SELECT order_id FROM orders WHERE status = 1 -- 索引覆盖爽歪歪

面试避坑指南
当面试官问“为什么索引没生效”,死亡回答TOP3:
❌ “数据库抽风了吧”
❌ “我明明建索引了!”
❌ “重启下试试?”
正确姿势:结合执行计划分析数据分布、查询条件、索引结构,像侦探一样推演。
🤑 会员省钱彩蛋:通过面试鸭返利网开通面试鸭会员可返25元,买题库相当于白嫖!

本文出现的核心关键词:MySQL索引失效分析、索引失效场景、索引失效优化、MySQL索引优化、联合索引失效、索引失效原因分析、索引失效解决方案


