建立了ABC联合索引
sql
INDEX idx_abc (A, B, C)
各种查询条件是否会走ABC联合索引,核心在于查询条件是否满足最左前缀匹配原则(查询条件必须从索引最左列开始连续匹配)
| 查询条件简写 | 是否可能走 idx_abc |
实际利用程度 | 说明(是否满足最左前缀) |
|---|---|---|---|
A |
会 | 用到 A | 满足 |
B |
不会 | 不用 | 不满足,缺少最左列 A |
AB |
会 | 用到 A、B | 满足,连续命中前两列 |
AC |
会 | 用到A, MySQL 5.6 以前 C 不能用于连续定位,5.6+ 可能通过 ICP 在索引层过滤 |
不满足,因为跳过了 B,所以不能完整利用 (A,B,C); 5.6 前通常在 Server 层判断 C, 5.6+ 可能在存储引擎层先判断 C,从而减少回表;是否回表取决于是否覆盖索引 |
BC |
不会 | 不用 | 不满足,缺少最左列 A |
ABC |
会 | 用到 A、B、C | 满足,完整命中 |
CBA |
会 | 用到 A、B、C | 满足,优化器会重排为ABC,ABC满足 |
A或B |
不一定 | 用到 A,会用B 用不到A,则后面也不用 | 比较复杂,OR 逻辑要拆成两个分支看: A=? 分支满足最左前缀, B=? 分支不满足最左前缀;因此整体是否走联合索引不稳定 |
A或A |
会 | 用到 A | 满足,类似 A IN (...) |
A IN + B |
会 | 用到 A、B | 满足,IN 可视为多个等值匹配 |
A IN + B IN + C |
会 | 一般可用 A、B、C | 满足,都是等值匹配,较友好 |
A范围 |
会 | 用到 A 范围 | 满足,从 A 开始做范围扫描 |
A范围 + B |
会 | 主要用 A | 满足,A 已经是范围,B 通常不能继续精确定位 |
A + B范围 |
会 | 用到 A、B | 满足,B 作为范围条件 |
A + B范围 + C |
会 | 用到 A、B,C 多数过滤 | 满足,B 范围之后,C 通常不能继续定位 |
A前缀LIKE |
会 | 用到 A 范围 | 满足,如 A LIKE 'abc%' |
A后缀LIKE |
不会 | 不用 | 不满足,如 A LIKE '%abc' |
上面查询语法的完全写法
| 简写 | 示例语法 |
|---|---|
ABC |
WHERE A = ? AND B = ? AND C = ? |
A或B |
WHERE A = ? OR B = ? |
A IN + B IN + C |
WHERE A IN (?, ?) AND B IN (?, ?) AND C = ? |
A + B范围 + C |
WHERE A = ? AND B > ? AND C = ? |
A前缀LIKE |
WHERE A LIKE 'abc%' |