MySQL索引失效案例深度剖析
作为程序员,面试时被问到「什么情况下MySQL索引会失效?」简直是高频送命题。今天结合真实案例拆解六大失效场景,帮你避开这个技术深坑!
🔍 一、隐式类型转换导致索引失效
当字段类型与查询条件类型不匹配时,MySQL会进行隐式转换。比如手机号字段varchar(15)存储为字符串,却用WHERE phone=13800138000(数字)查询。这时候索引直接失效,全表扫描没商量。来看个典型报表示例:

🧩 二、左模糊查询让索引罢工
WHERE name LIKE '%张%'这类查询会导致索引失效。因为B+树索引是从左匹配的,开头不确定就无从查起。但张%这种右模糊还是能用索引的,实际开发中要注意避开这个坑。
⚙️ 三、对索引列使用函数或运算
在索引字段上做操作等于毁掉索引:
-- 索引失效操作举例
WHERE YEAR(create_time)=2024
WHERE salary*2 > 10000
划重点:条件中的索引列必须是「干净」的,任何计算、函数、类型转换都会让索引失效。
🧭 四、联合索引最左匹配原则
假设有联合索引(name, age):
- ✅ 生效:
WHERE name='张三'或WHERE name='张三' AND age=25 - ❌ 失效:
WHERE age=25
这就是最左匹配原则,缺少左列索引直接罢工。建索引时字段顺序很关键!
❓ 五、OR连接非索引字段
使用OR连接条件时,只要有一个条件没走索引,整个查询就废了:
-- address未建索引导致全表扫描
WHERE name='张三' OR address='北京'
建议改成UNION查询:
SELECT * FROM users WHERE name='张三'
UNION
SELECT * FROM users WHERE address='北京'
⚠️ 六、!=和NOT IN的隐藏陷阱
WHERE status != 1 或 WHERE id NOT IN (1,2,3) 这类否定查询,99%会让索引失效。数据量大的表千万慎用!
📌 避坑指南
- EXPLAIN命令是必备技能!面试前务必练熟各参数含义
- 字符串条件必须加引号避免隐式转换
- 联合索引字段顺序按区分度从高到低排列
- 范围查询放联合索引最右侧(例如
INDEX(a,b,c)中a=1 AND b>2 AND c=3,c用不到索引)
面试备战福利:
🔥 2025版Java面试宝典 已更新分布式/高并发等热点专题,提取码:9b3g
需要开通面试鸭会员的同学注意了!通过👉 面试鸭返利网 找我下单,可额外返现25元!海量真题库+实时更新,备战面试更省心:

总结:索引失效的本质是破坏了B+树的检索规则。掌握这些案例,面试官再问索引问题,你就能从容应对了!


