联合索引
联合索引是指对数据库表中的多个列组合起来创建的索引。它不同于只对单个列创建的单列索引。
- 单列索引:
CREATE INDEX idx_name ON table (name);
- 联合索引:
CREATE INDEX idx_name_age ON table (name, age);
最左匹配原则
联合索引的核心特性是 最左前缀原则。这意味着索引是按照创建时列的顺序从左到右进行排序和存储的。
以
(name, age)索引为例,它的数据结构(通常是B+树)大致是这样的:- 首先按照
name字段进行排序。
- 在
name相同的情况下,再按照age字段进行排序。

覆盖索引
如果查询的列都包含在联合索引中(例如
SELECT name, age FROM table WHERE name = 'Alice'),数据库可以直接从索引中获取数据,而无需回表查询数据行。这极大地提升了性能。索引下推
在 MySQL 5.6 及以上版本中,即使查询条件没有完全遵循最左前缀(如上面的
WHERE name = 'Alice' AND salary = 50000),存储引擎也会在索引内部对可以使用的列进行判断,过滤掉不满足条件的记录,减少回表次数。这被称为 索引下推。设计原则
设计联合索引时,需要考虑查询的
WHERE子句和 ORDER BY子句。原则:
- 高频查询优先:将最常用于查询条件的列放在最左边。
- 等值查询列在前,范围查询列在后:
- 如果有一个列通常用于等值查询(
=),而另一个列用于范围查询(>,<,BETWEEN),应将等值查询的列放在前面。 - 例如,
WHERE name = 'Alice' AND age > 20,索引(name, age)是最优的。因为name是等值,可以快速定位到所有叫 Alice 的人,然后在这些结果中按age排序进行范围扫描。
- 考虑排序(ORDER BY):
- 如果查询中经常有
ORDER BY a, b,那么创建联合索引(a, b)可以避免数据库在查询时进行额外的排序操作(Filesort),因为索引本身已经是有序的。






Loading Comments...