【mysql】B+树结构在各个索引类型中的表现形式

B+树索引是目前关系型数据库系统中查找最为常用和最为有效的索引。

B+树索引并不能找到一个给定键的具体行,B+树索引能找到的只是被查找数据行所在的页,然后数据库通过把页读入到内存,再在内存中进行查找,最后得到要查找的数据。

B+树

由二叉树演变而来是B树的变种。
在B+树中,所有记录节点都是按键值的大小顺序存放在同一层的叶子节点上,由各叶子节点指针进行连接。
在这里插入图片描述
不同索引中的B+树结构
聚集索引

如上图所示的B+树结构,在mysql数据库中,对于聚集索引的B+树结构,在Index page中存放的就是表中的主键值和指针,对于leaf page存放的就是当前页中按照主键索引排列好的数数据记录。
在这里插入图片描述
辅助索引

但是对于辅助索引,mysql在index page中存放的是辅助索引

的键值和指针,在leaf page中存放的则是辅助索引对应的主键的值和一个书签(bookmark),该书签用来高速innodb存储引擎哪里可以找到与索引相对应的行数据,其实就是相应行数据的聚集索引键。
举个例子:如果在一棵高度为3的辅助索引树中查找数据,那需要对这棵辅助索引树遍历3次找到指定主键,如果聚集索引树的高度同样为3,那么还需要对聚集索引树进行3次查找,最终找到一个完整的行数据所在的页。因此一共需要6次逻辑io访问以得到最终的一个数据页。

找到一张很形象的图:

### MySQL 中 B+ 的数据结构及其应用 #### B+ 的基本原理 B+ 是一种平衡多路查找,其核心特点是所有实际数据都存储在叶子节点上,而内部节点仅保存索引信息。这种设计使得 B+ 非常适合范围查询和顺序扫描操作[^1]。 - **节点组成** 每个节点由若干个关键字和指针构成。对于非叶子节点,关键字用于引导搜索方向;而对于叶子节点,则包含指向真实数据的指针或者直接存储数据本身。 - **高度平衡性** 所有叶节点位于同一层,这保证了每次查询的时间复杂度为 \(O(\log n)\),其中 \(n\) 是中节点的数量。相比二叉可能退化成链表的情况(时间复杂度降级到 \(O(n)\)),B+ 具有更高的稳定性和效率[^2]。 #### MySQL 中 B+ 的应用场景 MySQL 的 InnoDB 存储引擎广泛采用了 B+ 作为其主要索引结构。以下是具体应用场景: ##### 聚簇索引 (Clustered Index) 聚簇索引是基于主键建立的一种特殊类型索引,在该模式下,数据行按照主键值物理排序并存储于磁盘上的连续位置。因此,通过主键检索可以一次性定位目标记录,无需额外读取其他页面,从而显著提升性能[^5]。 ```sql CREATE TABLE example ( id INT PRIMARY KEY, name VARCHAR(50), age INT ); ``` 上述语句创建了一个名为 `example` 的表格,默认情况下会为主键字段 `id` 构建一棵 B+ 形式的聚簇索引。 ##### 非聚簇索引 (Secondary Index / Non-clustered Index) 除了主键外定义的任何列都可以用来创建辅助索引即非聚簇索引。这类索引同样采用 B+ 形式组织起来,不过它们并不直接关联原始数据项的位置——相反,它们只保留对应主键值的信息以便后续跳转至相应的聚簇索引部分完成最终匹配工作。 假设我们在前面提到的例子基础上增加如下命令: ```sql ALTER TABLE example ADD INDEX idx_name_age(name, age); ``` 这里新增加了一棵针对组合属性 `(name, age)` 的独立 B+ 实例。每当执行涉及这两个维度条件过滤的操作时,系统能够迅速锁定符合条件的一组候选集,并借助所携带的附加主键线索进一步精确定位所需的具体实体对象[^3]。 #### 实现细节分析 为了支持高效的随机访问以及批量处理需求,InnoDB 设计了几种专门服务于不同层次间交互作用的关键组件,其中包括但不限于以下几种机制[^4]: - **缓冲池管理**: 将频繁使用的页缓存在内存里减少硬盘 I/O 开销; - **自适应哈希索引(AHI)**: 动态生成某些热点区域内的快速映射关系加速特定类型的工作负载表现; - **压缩技术运用**: 对大尺寸记录实施无损编码降低整体占用空间进而优化 IO 性能等等... 综上所述可以看出,正是由于具备如此众多优越特性的加持才让 B+ 成为了当前主流关系型数据库管理系统首选的基础架构之一。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值