晓风的码研工坊Java Dev Mentorship
返回技术分享数据库

MySQL 索引失效的常见场景

为什么加了索引,SQL 还是走了全表扫描?梳理 8 种索引失效的常见场景与排查方法。

2025-05-0811 分钟
MySQL 索引失效的常见场景

"加索引"是性能优化面试题的标准答案,但更能体现功底的是回答"为什么这条 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调优
CONTACT

扫码咨询,聊聊你的辅导需求

添加微信备注「毕设 / 作业 / 面试 + 学校或岗位」,通常 2 小时内回复。

微信咨询二维码
长按识别 / 扫码添加
微信号xiaofengtech-top
响应时间周一至周五20:00-23:30,周六至周日 9:00 - 23:00(响应通常在 2 小时内)
  • 沟通后 24 小时内给出可行性评估与辅导方案
  • 辅导过程中的代码与文档全部归你所有
  • 进度延期或方向不合适可随时调整,不套模板打包卖课