美文网首页
MySQL联合索引底层存储结构和原理

MySQL联合索引底层存储结构和原理

作者: 董董呀 | 来源:发表于2024-02-29 09:56 被阅读0次

联合索引概念

有两列及多列索引称为联合索引

底层存储结构

例如有以下数据
CREATE TABLE test_table_union_index (
id bigint(20) NOT NULL AUTO_INCREMENT,
merchant_id int(20) NOT NULL,
order_id int(20) NOT NULL,
PRIMARY KEY (id),
KEY merchant_id_order_id (merchant_id,order_id) USING BTREE
)

image.png

索引merchant_id_order_id底层存储结构


image.png

通过以上索引结构可以看出,联合索引特点:

  • B+树通过索引首列值构建,如 merchant_id_order_id_union_index 根据 merchant_id 构建
  • 叶子节点拥有联合索引中的所有字段以及主键字段,且叶子节点数据局部有序,如我们有一个三个字段的联合索引(a,b,c):
    叶子节点(1):
    a,b,c(1,3,3)
    a,b,c(1,3,4)
    a,b,c(1,4,1)
    a,b,c(1,4,2)
    叶子节点(2)
    a,b,c(2,3,3)
    a,b,c(2,3,4)
    a,b,c(2,4,1)
    a,b,c(2,4,2)
    a 列在B+树整体有序,a 列相同的情况下 b 列数据按序排列,但 c列不一定有序。

查询过程

  • 最左匹配

联合索引遵循最左匹配原则,只能从左往右依次搜索联合索引字段,否则索引字段不生效
例如索引是 key_index (a,b,c)。 可以支持 a 、a,b 、a,b,c 3种组合进行查找,但不支持 b,c 、c 进行查找

  • 查询过程
    SELECT * FROM test_table_union_index WHERE merchant_id = 3 AND order_id = 2;
image.png

联合索引遵循最左匹配原则,以上述查询 SQL 为例,联合索引先根据 merchant_id = 3 在构建的B+树索引上进行查询数据,找到叶子节点:


image.png

然后根据 order_id = 2 查询定位数据,查询到数据对应的主键 ID = 2,最后进行回表查询

联合索引优点

  • 支持复杂查询

联合索引能够加速包含多个条件和多个列的查询。这对于联接多个表或需要在多列上进行过滤的查询非常有用。

  • 索引覆盖查询

联合索引可以覆盖多个查询中的列,从而减少了数据库的I/O负载。这意味着数据库不必访问数据行,而可以直接使用索引来满足查询条件

  • 提高排序和分组性能

如果你的查询需要排序或分组结果,联合索引可以在这方面提供显著的性能改进,特别是当排序或分组涉及索引中的列时

  • 减少索引数量

使用联合索引可以减少索引的数量,这对于大型数据库来说是一个重要考虑因素,因为每个额外的索引都会增加数据库维护的开销

常见问题分析

  • 为什么遵循最左匹配原则

从联合索引的底层存储结构我们可以知道,联合索引是根据字段从左往右组织的,不从左边的字段开始查询无法使用索引。

  • 联合索引中字段范围查询为什么会导致后续联合索引字段可不用

从联合索引的底层存储结构我们可以知道,叶子节点数据局部有序。联合查询中范围查询会导致后续字段数据无序,导致联合索引中后续索引字段失效。

相关文章

网友评论

      本文标题:MySQL联合索引底层存储结构和原理

      本文链接:https://www.haomeiwen.com/subject/ppfqzdtx.html