MySQL索引失效的场景对比
作为程序员,面试被问“MySQL索引什么时候会失效?”简直是经典送命题。今天咱们就掰开揉碎了聊聊常见的索引失效场景,帮你避开面试大坑!
📌 一、对索引列使用函数或表达式
SELECT * FROM users WHERE YEAR(create_time) = 2023;
即使create_time有索引,用YEAR()函数包裹后索引直接罢工。MySQL表示:这字段都被你加工了,我咋用索引?
🔍 二、隐式类型转换
SELECT * FROM orders WHERE user_id = '10086';
当user_id是整型却用字符串查询时,MySQL会偷偷做类型转换。索引:这操作我接不住,告辞!

⚖️ 三、OR连接非索引列
SELECT * FROM products
WHERE category_id = 5 OR price > 100;
若price没索引,即使category_id有索引,整个查询直接全表扫描。OR一拖后腿,全家遭殃!
🔄 四、最左前缀原则失效
联合索引(a,b,c):
SELECT * FROM table WHERE b = 2 AND c = 3; -- 失效
SELECT * FROM table WHERE a = 1 AND c = 3; -- 部分失效
就像查字典必须先找首字母,跳过头部字段的联合索引直接废掉。

🧮 五、使用不等于(!= / <>)
SELECT * FROM logs WHERE status != 1;
不等于操作导致需要扫描几乎所有索引页,效率往往不如全表扫描。优化器:这活儿我不接了!
📉 六、LIKE以通配符开头
SELECT * FROM articles WHERE title LIKE '%优化%';
%在开头时索引无法定位起始位置,只能遍历全部索引。建议用全文索引替代。
🚫 七、索引列参与计算
SELECT * FROM sales WHERE price + 10 > 100;
在索引列上进行运算,相当于每次查询都要重新计算。索引哭晕在厕所:你早算好啊!
🎁 面试资源福利
2025年Java面试宝典 已整理完毕,包含MySQL高频考点解析!
💡 避坑指南
- 用
EXPLAIN查看执行计划是黄金法则 - 字符串字段查询注意加引号
- 联合索引字段顺序遵循高频查询条件
- 避免在WHERE子句“玩弄”索引列
最后悄悄说:如果需要开通面试鸭会员,通过面试鸭返利网找我可返25元!海量真题库+会员专享解析助你通关👇



