索引的最左匹配原则(Leftmost Prefix Principle)是数据库中使用**联合索引**时的重要规则,它决定了查询在什么情况下可以有效利用索引。
---
### 🔍 原则定义:
在使用联合索引时,MySQL 等数据库会从索引的**最左列开始匹配**,并且**连续地匹配到某一列为止**。如果跳过了某列,则后续列将**不再使用索引**。
---
### 📌 示例说明:
假设有一个联合索引:`idx_user_product_age (user_id, product_id, age)`
| 查询条件 | 是否使用索引 | 说明 |
|----------|---------------|------|
| WHERE user_id = 100 | ✅ 使用索引 | 匹配最左列 |
| WHERE user_id = 100 AND product_id = 200 | ✅ 使用索引 | 匹配前两列 |
| WHERE user_id = 100 AND product_id = 200 AND age = 30 | ✅ 使用索引 | 完整匹配所有列 |
| WHERE product_id = 200 | ❌ 不使用索引 | 没有包含最左列 user_id |
| WHERE user_id = 100 AND age = 30 | ⚠️ 仅使用 user_id 部分 | 跳过了 product_id,[age]
---
### 💡 注意事项:
- 顺序很重要:`WHERE product_id = 200 AND user_id = 100` 和 WHERE user_id = 100 AND product_id = 200 是等价的,但优化器通常能识别并正确使用索引。
- 范围查询中断匹配:如 WHERE user_id = 100 AND product_id > 200 AND age = 30,此时 [age](file://C:\Users\abc_7\Git-repository\jrsyb\gqcg-gys\src\main\java\com\xinyuan\gys\model\po\Gys_talent.java#L38-L38) 不再走索引。
- 避免跳跃字段:创建索引时应根据常见查询模式设计字段顺序。
---
### ✅ 最佳实践建议:
1. 将**区分度高的字段放左边**(如用户ID、订单号等)。
2. 根据实际查询 SQL 的 WHERE 条件顺序设计索引。
3. 对于经常一起出现的查询条件,考虑建立合适的组合索引。
---
### 🧠 总结一句话:
> “联合索引要从最左开始匹配,中间不能断,遇到范围就停。”
这是理解最左匹配原则的核心口诀。