MySQL 的 SELECT * 一定导致索引失效?
一句话概括
从优化器回表成本权衡切入,系统梳理 7 类索引失效场景——SELECT * 非必然失效但因回表占比超 20%~30% 会被放弃。
实践内容
7 类索引失效场景
- SELECT * 非必然失效 —— 但因回表占比超 20%~30% 会被放弃
- 违背最左前缀 —— 含 8.0.13 Index Skip Scan 在 8.0.31 的 Bug #109145
- 索引列函数运算 —— 对索引列使用函数
- LIKE ‘%xx’ 前缀通配 —— 前缀通配符
- OR 与 Index Merge —— OR 条件
- IN 超 eq_range_index_dive_limit=200 —— IN 列表过长
- 隐式类型转换发生在索引列侧 —— 类型不匹配
ORDER BY 触发 Using filesort
ORDER BY 也可能触发 filesort。
摘录
从优化器回表成本权衡切入,系统梳理 7 类索引失效场景——
SELECT *非必然失效但因回表占比超 20%~30% 会被放弃、违背最左前缀(含 8.0.13 Index Skip Scan 在 8.0.31 的 Bug #109145)。
索引列函数运算、
LIKE '%xx'前缀通配、OR 与 Index Merge、IN超eq_range_index_dive_limit=200、隐式类型转换发生在索引列侧、ORDER BY 触发Using filesort。
涉及实体
- []
涉及主题
- []
我的评注
虽然不是 AI 相关的,但这些 MySQL 索引优化知识对任何后端开发者都很重要。“SELECT * 非必然失效”这个观点纠正了很多人的误解。