联合索引是指对数据库表中的多个列组合起来创建的索引。它不同于只对单个列创建的单列索引。
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 a, b,那么创建联合索引 (a, b)可以避免数据库在查询时进行额外的排序操作(Filesort),因为索引本身已经是有序的。