最左匹配原则是B+树索引的一个重要特性,它指的是在使用复合索引(即包含多个列的索引)时,查询条件必须从索引的最左边列开始才能利用索引。下面我们从B+树索引的结构角度来解释为什么会有最左匹配原则。
B+树索引结构
B+树索引是一种广泛使用的索引结构,它具有以下特点:
键值对:
B+树的每个节点包含键值对,键是索引列的值,值通常是指向实际数据行的指针。
有序排列:
B+树中的键按照排序顺序存储。
叶子节点:
所有的数据行指针都存储在叶子节点中,叶子节点之间通过指针相连,形成一个链表。
非叶子节点:
非叶子节点用于索引的分层结构,帮助快速定位到叶子节点。
最左匹配原则的解释
索引列顺序:
在复合索引中,索引列的顺序决定了B+树中键的顺序。例如,如果有一个复合索引 (col1, col2, col3),那么B+树中的键就是 (col1, col2, col3) 的值组成的元组。
索引查找:
当执行查询时,MySQL 会从根节点开始,根据查询条件中的第一个列(即复合索引中最左边的列)的值向下遍历B+树。
如果查询条件从最左边的列开始,MySQL 可以沿着树的路径向下移动,直到找到匹配的键值对。
如果查询条件不从最左边的列开始,MySQL 无法有效地使用索引,因为无法确定从哪个分支开始查找。
例子:
假设有一个复合索引 (col1, col2, col3),并且执行以下查询:
SELECT * FROM table_name WHERE col1 = 1 AND col2 = 2 AND col3 = 3;
这个查询从复合索引的最左边开始,因此可以有效地使用索引。
然而,如果执行以下查询:
SELECT * FROM table_name WHERE col2 = 2 AND col3 = 3;
由于查询条件没有从最左边的列开始,MySQL 无法有效地使用索引 (col1, col2, col3)。
图解说明
假设我们有一个复合索引 (col1, col2, col3),B+树的结构大致如下:
+----------------+ | (1, 1, 1) | +----------------+ / \ +------------+ +------------+ | (1, 1, 2) | | (1, 2, 1) | +------------+ +------------+ / \ / \ +-------+ +-------+ +-------+ +-------+ | (1, 1, 3)| | (1, 1, 4)| | (1, 2, 2)| | (1, 2, 3)| +-------+ +-------+ +-------+ +-------+
查询 (col1, col2, col3) = (1, 1, 3):
从根节点开始,根据 col1 的值 1 移动到相应的子节点。
在子节点中,根据 col2 的值 1 移动到相应的子节点。
在叶子节点中,根据 col3 的值 3 查找匹配的行。
查询 (col2, col3) = (1, 3):
由于没有从最左边的列开始,MySQL 无法有效地使用索引,只能进行全表扫描。
结论
最左匹配原则是B+树索引结构的一个自然结果。在复合索引中,查询条件必须从索引的最左边列开始才能利用索引。这是因为在B+树中,索引键的排序依赖于最左边的列,而索引查找是从根节点开始,沿着树的路径向下移动,直到找到匹配的键值对。如果查询条件不从最左边的列开始,MySQL 无法确定从哪个分支开始查找,因此无法有效利用索引。
源自:ai