在 MySQL 中,联合索引(Composite Index)可以覆盖多个列,但是否能够被查询使用,取决于是否满足最左前缀原则。理解该原则的具体生效条件,有助于正确设计索引并判断 SQL 是否能够命中索引。
下面对联合索引最左前缀原则及其常见情况进行说明。
联合索引是由多个列组成的索引,例如:
CREATE INDEX idx_user_status_time
ON orders(user_id, status, create_time);该索引的列顺序为:
(user_id, status, create_time)列的顺序会直接影响索引的使用方式。
最左前缀原则指的是:
查询条件中必须包含联合索引的最左侧列,索引才能被使用。
以上面的索引为例:
user_id 是最左列
user_id,索引将无法生效
SELECT *
FROM orders
WHERE user_id = 1001;可以使用联合索引中的 user_id 部分。
SELECT *
FROM orders
WHERE user_id = 1001
AND status = 1;可以使用 (user_id, status) 这一段索引。
SELECT *
FROM orders
WHERE user_id = 1001
AND status = 1
AND create_time > '2024-01-01';可以使用整个联合索引。
SELECT *
FROM orders
WHERE status = 1;由于缺少 user_id,联合索引不会被使用。
SELECT *
FROM orders
WHERE user_id = 1001
AND create_time > '2024-01-01';status 被跳过,索引只能使用到 user_id,后续列无法继续匹配。
当联合索引中出现范围查询(>、<、BETWEEN)时:
SELECT *
FROM orders
WHERE user_id = 1001
AND status = 1
AND create_time > '2024-01-01';在多数情况下:
因此,范围条件所在的列通常应放在联合索引的末尾。
等值查询(=)对联合索引最友好:
WHERE user_id = 1001 AND status = 1多个等值条件可以连续使用联合索引,不会中断匹配。
最左前缀原则的存在,主要基于以下考虑:
因此,联合索引并不是“多列同时生效”,而是按顺序逐步生效。
关于联合索引最左前缀原则,可以总结为:
在设计联合索引时,应结合实际查询条件,合理安排列顺序。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。