- 最左匹配原则是指在一个复合条件查询语句中,会先检查最左侧的条件,如果这个条件能够使用索引进行匹配,那么就会使用索引来提高查询效率,如果不能使用索引,那么就会扫描整张表来查找匹配的记录
- 多列索引是基于多个字段的索引,它可以同时按照多个字段进行查找操作。由于B+树的这些性质,它只能根据一个键值来进行构建。如果要根据多个键值来构建B+树,那么就需要对每个键值都构建一个独立的B+树,这样就会造成大量的空间浪费和维护成本。因此,因此在构建多列索引时,数据库会使用多列索引中最左边的字段来构建B+树,这样就可以支持多个字段的查找操作了。
索引 |
值 |
a |
1,1,2,2,3,3 |
b |
1,2,1,4,1,2 |
- 最左匹配原则和多列索引的索引存储结构和检索方式是有关。在多列索引中,a索引是有序排列,而b索引是无序排列。
- 当查询条件为 b = 2 时,没有办法利用索引,因为b是无序的。
- 当查询条件中不存在 a,索引失效。
- MySQL 引擎在执行查询时,为了更好地利用索引,在查询过程中会动态调整查询字段的顺序,使其满足最左匹配。因此在多列索引(last_name, first_name)中,以下两种查询都可以使用索引。
示例
SELECT *
FROM
test
WHERE
last_name='Jones'
AND
first_name='John';
SELECT *
FROM
test
WHERE
first_name='John'
AND
last_name='Jones';
- 在范围查询(>、<、BETWEEN、LIKE)下,索引的最左匹配原则会一直向右匹配直到遇到范围查询停止,即范围查询最左边的字段可以匹配索引,之后的字段无法使用索引,会被忽略,索引失效。MySQL 5.6 版本之后开启了索引条件下推优化 ,后面的索引列会加入全索引扫描用于筛选,因此索引生效。
- 范围查询无法完全使用最左匹配原则的原因是,最左匹配原则只能处理等值比较。在等值比较中,我们只需要比较一个值是否等于另一个值,因此只需要比较一个列。但是,在范围查询中,我们需要比较一个值是否在某个范围内,这需要比较多个值,因此无法完全使用最左匹配原则。
- 假设有多列索引(age, sex),age可以使用索引,sex不能使用索引。只使用了 age 索引来选择行
示例
SELECT * FROM user
WHERE age > 20
AND sex='男';
示例
SELECT * FROM user
WHERE age < 20
AND sex='男';
示例
SELECT * FROM user
WHERE age
BETWEEN 16 AND 25
AND sex='男';
- 最左匹配原则适用于 LIKE 语句,但只有 LIKE "XXX%" 的情况索引生效,LIKE "%XXX" 索引失效。
- 假设有多列索引(name, sex),name 可以使用索引,sex 不能使用索引。只使用了 name 索引来选择行
示例
SELECT * FROM user
WHERE
name LIKE '张%';
SELECT * FROM user
WHERE
name LIKE '张%'
AND sex='男';
来自 <https://blog.nowcoder.net/n/ec992dcb46b345789457bbcf891cd190>