【MySQL 优化必备】联合索引的最左前缀原则,一次说透!
今天我们来聊聊 MySQL 优化中一个经典问题 —— 最左前缀原则。
👉 面试官经常会问:
-
• “联合索引为什么要遵循最左前缀原则?” -
• “建了 (a,b,c) 联合索引,能用在哪些查询上?”
很多同学脑袋一懵,只能说:
“好像要从左到右用才行吧……”
其实,最左前缀原则背后有一套清晰的逻辑。
一、什么是联合索引?
联合索引(Composite Index) 指在多个字段上建立的索引。
👉 举例:
CREATE INDEX idx_name_age_city ON user(name, age, city);
这个索引就包含了 name、age、city 三个字段。
二、最左前缀原则
📌 定义:
MySQL 在使用联合索引时,会优先按照最左边的字段开始匹配,一旦中间某个字段没有出现在查询条件里,后面的字段索引就可能失效。
👉 口诀:从左往右,不能跳过。
三、举例说明
假设我们有联合索引 (name, age, city)。
1. 能用索引的情况 ✅
-- 命中 name
SELECT * FROM user WHERE name = 'Tom';
-- 命中 name + age
SELECT * FROM user WHERE name = 'Tom' AND age = 20;
-- 命中 name + age + city
SELECT * FROM user WHERE name = 'Tom' AND age = 20 AND city = 'Beijing';
-- 命中前缀 (like 'Tom%')
SELECT * FROM user WHERE name LIKE 'Tom%';
2. 不能完全用索引的情况 ❌
-- 跳过 name,直接查 age
SELECT * FROM user WHERE age = 20; -- 索引失效
-- 中间断开,跳过 age
SELECT * FROM user WHERE name = 'Tom' AND city = 'Beijing';
👉 原因:联合索引底层是按 (name, age, city) 排序存储的,必须先利用到 name,才能继续利用后面的字段。
四、最左前缀原则的核心逻辑
-
• 索引是按照字段顺序构建的(类似电话簿)。 -
• (name, age, city)就像“按姓名 → 年龄 → 城市”排序的电话簿。 -
• 你想用“城市”直接查?抱歉,没法利用。
五、优化技巧
-
1. 把区分度高的字段放在前面 -
• 比如手机号、身份证号适合放在联合索引最左边。 -
2. 合理设计查询 SQL -
• 确保能利用到最左前缀。 -
3. 避免函数和隐式转换 -
• 比如 WHERE name LIKE '%Tom',前缀没用到,索引失效。
六、总结一句话
-
• 最左前缀原则 = 从左往右用索引,不能跳过中间。 -
• 口诀:用到左边,才能用到右边;跳过中间,后面失效。 -
• 实战建议:建索引时,把区分度高的字段放前面,SQL 写法尽量命中最左前缀。
🎯 面试必备回答:
联合索引遵循最左前缀原则,即查询必须从最左的字段开始匹配,才能利用索引。
比如索引 (a,b,c),能用于a,a+b,a+b+c,但不能直接用于b或c。
因为索引是按照字段顺序存储的,只有按顺序使用才能利用到排序的特性。

