A,B,C三个字段组成联合索引,AB,AC,BC三种情况下查询是否能命中索引

一、联合索引的命中原理

当创建联合索引 (A, B, C) 时,MySQL 会按照以下规则构建索引:

  1. 索引排序:先按 A 排序,A 相同则按 B 排序,B 相同则按 C 排序
  2. 最左前缀原则:查询条件必须从索引的最左列开始,且中间不能跳过列
  3. 范围查询截断:若中间列使用范围查询(如>、BETWEEN),则后续列无法使用索引

二、AB、AC、BC 三种组合的索引命中情况

1. 查询条件为 AB(A 和 B 同时存在)
  • 索引命中情况:完全命中,查询条件从最左列 A 开始,且包含 B,符合最左前缀原则
EXPLAIN SELECT * FROM table WHERE A = 1 AND B = 2;
-- key列显示联合索引(A,B,C)
-- type为ref(使用索引查找匹配值)
2. 查询条件为 AC(A 和 C 存在,B 缺失)

索引命中情况:仅 A 列有效,查询条件跳过了中间列 B,违反最左前缀原则

EXPLAIN SELECT * FROM table WHERE A = 1 AND C = 3;
-- key列显示联合索引(A,B,C)
-- key_len仅包含A列的长度(如A为INT,key_len=4)
-- type为range(仅对A列使用索引范围扫描)
3. 查询条件为 BC(B 和 C 存在,A 缺失)
  • 索引命中情况:未命中,查询条件未从最左列 A 开始,完全违反最左前缀原则
EXPLAIN SELECT * FROM table WHERE B = 2 AND C = 3;
-- key列为NULL(未使用索引)
-- type为ALL(全表扫描)

优化策略

若经常需要 BC 组合查询,可创建新的联合索引 (B, C) 或 (B, C, A)

若无法避免 AC 组合,可添加 A 列的常量条件(即使无实际过滤意义):

-- 原查询:无法利用索引
SELECT * FROM table WHERE B = 2 AND C = 3;

-- 改写后:可利用联合索引(A,B,C)
SELECT * FROM table WHERE A IS NOT NULL AND B = 2 AND C = 3;
-- 需确保A列无NULL值,否则可能影响结果

若查询仅需索引列(如SELECT A, B, C FROM table),即使部分命中索引,也可避免回表:

EXPLAIN SELECT A, B, C FROM table WHERE A = 1 AND C = 3;
-- Extra列显示Using index(覆盖索引)

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部