MySQL执行计划:索引为何失效?如何避免?
为表创建了索引,查询却依然慢如蜗牛,`EXPLAIN`结果中`key`一栏赫然写着`NULL`——这是最令人沮丧的情况之一。理解索引失效的常见场景并学会通过执行计划来识别它们,是写出高效SQL的关键。
解决方案一:通过EXPLAIN诊断索引失效原因并修正
手动排查是深入理解MySQL工作机制的最佳途径。
1. 常见索引失效场景:
左模糊匹配:`LIKE '%keyword'` 或 `LIKE '%keyword%'` 无法利用索引。`LIKE 'keyword%'` 则可以利用。
对索引列使用函数或计算:`WHERE YEAR(create_time) = 2023` 会导致索引失效。应改为范围查询:`WHERE create_time >= '2023-01-01' AND create_time < '2024-01-01'`。
类型转换:如果字段是字符串类型,但查询条件用了数字(如`WHERE id = '123'`,其中`id`是整数),可能会抑制索引使用。
不符合最左前缀原则:对于复合索引`(a, b, c)`,查询条件`WHERE b = 1 AND c = 2`无法使用该索引。
2. 使用EXPLAIN验证:在调整了SQL写法或表结构后,立即再次运行`EXPLAIN`,观察`key`字段是否显示了预期的索引,`rows`字段的预估行数是否显著下降。
解决方案二:使用备份工具安全地进行索引实验
当你通过执行计划分析怀疑索引失效,并设计出一个新的索引方案时:
1. 首先,使用80KM-mysql备份工具为生产数据库创建一个快照备份。
2. 然后,将备份还原到测试环境。
3. 在测试环境中,执行你的`CREATE INDEX`语句,并运行优化前后的查询,使用`EXPLAIN`对比执行计划的差异,并使用`SELECT`语句实际计时,定量评估性能提升效果。
4. 确认有效且无负面影响后,再在生产环境实施。