2025年Java面试宝典(提取码:9b3g)整理了MySQL高频面试真题,建议配合本文阅读效果更佳。

二、MySQL索引最左匹配原则深度解析
MySQL索引最左匹配原则是面试中必考的高频知识点,特别在涉及联合索引优化时,理解该原则能帮助我们避免80%以上的索引失效问题。本文将通过真实面试场景还原,带你掌握最左匹配原则的本质。
2.1 最左匹配原则的底层原理
B+树索引结构决定了联合索引的存储方式:索引按定义字段的从左到右顺序构建排序。例如定义(a,b,c)联合索引时:
- 先按a字段排序
- a相同则按b排序
- a、b都相同再按c排序
这种结构特性导致查询必须从最左侧字段开始使用,就像查字典必须知道首字母才能快速定位一样。缺少左侧字段时,索引树无法确定扫描起点,就会退化成全表扫描。
2.2 最左匹配原则生效场景
假设存在(name,age,position)联合索引:
-- 有效查询(走索引)
SELECT * FROM employee WHERE name='张三'
SELECT * FROM employee WHERE name='李四' AND age=30
SELECT * FROM employee WHERE name='王五' AND age=25 AND position='工程师'
-- 有效范围查询
SELECT * FROM employee WHERE name>'陈' AND name<'杨'
SELECT * FROM employee WHERE name='赵六' AND age BETWEEN 25 AND 30
这三个案例都满足前缀连续性原则,特别是范围查询时要特别注意:当遇到范围查询(>、<、BETWEEN)后,右侧的索引列将失效。

2.3 最左匹配原则失效场景
-- 失效查询(全表扫描)
SELECT * FROM employee WHERE age=30
SELECT * FROM employee WHERE age=25 AND position='架构师'
SELECT * FROM employee WHERE name='张三' AND position='经理'
当跳过左侧字段直接使用中间或右侧字段时,索引无法发挥作用。特别注意第三个查询虽然使用了name字段,但跳过了age字段直接使用position,导致只能使用name字段的索引,position字段无法参与索引查询。
2.4 特例:索引下推优化
MySQL5.6引入的索引下推(ICP)优化了部分场景:
SELECT * FROM employee
WHERE name LIKE '张%'
AND age=30
AND position='工程师'
在5.6之前,这个查询只能使用name字段索引,5.6之后存储引擎会先过滤age=30的记录,再将结果交给Server层过滤position。虽然索引字段未完全匹配,但通过ICP减少了回表次数。
2.5 索引设计优化建议
- 高频查询字段前置:将区分度高且频繁作为查询条件的字段放在左侧
- 避免冗余索引:已有
(a,b)索引时,单独创建a字段索引是多余的 - 范围字段靠右:将需要范围查询的字段放在联合索引最后
- 控制索引长度:对字符串类型使用前缀索引
如果大家需要购买面试鸭会员,可以通过面试鸭返利网找到我,返利25元。本站持续更新数据库优化实战技巧,助你轻松应对技术面试。



