MySQL 的联合索引(又称复合索引)是指在一个索引中包含多个列,允许在这些列上同时进行查询优化。使用联合索引有助于提升多列查询的性能,但其运作机制具有一些独特的特点:
1. 遵循最左前缀匹配原则
联合索引在使用时,遵循最左前缀匹配原则。也就是说,查询语句中使用的列必须从索引的最左边开始,依次匹配索引中的列,才能有效地利用索引。
- 如果你创建了一个
(A, B, C)
的联合索引,MySQL 可以使用以下组合来加速查询:(A)
(A, B)
(A, B, C)
- 但不能直接使用索引的中间或右侧列,比如
(B)
或(C)
,否则索引不会被使用或只能部分使用。
2. 索引顺序对查询有影响
联合索引中列的顺序非常重要,因为 MySQL 会根据查询条件从左至右使用索引。如果查询条件未从最左列开始,索引将无法被有效利用。例如:
- 对于
(A, B, C)
的联合索引,查询WHERE B = 1 AND C = 2
无法使用该索引,但WHERE A = 1 AND C = 2
可以部分使用索引(会根据A
进行过滤)。
3. 可以覆盖查询
如果一个查询的所有列都在联合索引中,并且查询的列只包括这些索引中的列,那么 MySQL 可以通过联合索引直接返回结果,而不需要回表查询。这种情况称为覆盖索引,能够极大地提升查询性能。
例如,对于联合索引 (A, B, C)
,查询 SELECT A, B FROM table WHERE A = 1 AND B = 2
可以直接从索引中获取结果,而不需要回表查询。
4. 提高多列条件查询的效率
联合索引特别适合用于多列的查询条件。如果一个查询涉及多列,且这些列恰好在联合索引中,MySQL 能够同时利用这些列来加速查询。例如,WHERE A = 1 AND B = 2
使用 (A, B)
联合索引时,会同时利用 A
和 B
列来进行过滤和排序。
5. 索引排序(ORDER BY)的使用
联合索引可以帮助优化 ORDER BY
操作,但同样遵循最左前缀原则。如果 ORDER BY
使用的列和索引的最左列顺序一致,MySQL 可以通过索引直接返回排序好的结果,避免额外的排序操作。
例如:
- 联合索引
(A, B, C)
,查询SELECT * FROM table WHERE A = 1 ORDER BY B, C
可以利用索引来完成排序。 - 但如果
ORDER BY C
而不涉及A
和B
,索引无法优化排序。
6. 查询范围条件的影响
在联合索引中,一旦某个列使用了范围查询(如 >
, <
, BETWEEN
, LIKE 'xx%'
等),其后的列将无法继续使用索引。例如:
- 对于
(A, B, C)
联合索引,如果查询条件是A = 1 AND B > 2 AND C = 3
,索引只能用到A
和B
,无法继续用于C
列。
7. 选择性较高的列放在前面
为了充分利用索引的效率,通常将选择性较高的列(即值较为唯一的列)放在联合索引的前面。选择性高的列能够更快地过滤数据,减少查询的扫描范围。例如,在 (A, B)
联合索引中,如果 A
列的值种类多,选择性高,应将其放在索引的前面。
8. 避免冗余索引
如果已经存在一个 (A, B)
的联合索引,则无需再单独为 A
列创建索引,因为联合索引的最左前缀原则已经能够覆盖 A
列的查询需求。
小结:
MySQL 联合索引的特点可以总结为:
- 最左前缀原则:从最左列开始匹配。
- 索引顺序重要:查询和排序需要匹配索引列的顺序。
- 可以实现覆盖索引,避免回表查询。
- 提高多列查询效率,尤其是遵循联合索引的顺序。
- 范围查询会限制后续列的索引使用。