MySQL之B+树

B+树是一种高效的数据存储结构,尤其适用于数据库索引。它通过页存储减少IO操作,每个页包含有序的用户数据并链接下一个页。主键索引,即聚集索引,使物理顺序与逻辑顺序相同,而非聚集索引则不遵循此规则。查询时,系统会根据最左匹配原则决定是否使用索引。优化器会评估不同路径的耗时和回表次数,选择最佳策略。

B+

页的存在方便读取,一次读取一条数据需要调用多次IO,而使用页存储,一次读取8KB的数据,减少了IO的反复读取

一个页16KB

页目录中存放的是每一个页中最小值

每一个页中存放的是用户数据区域,而用户区域中存放也是有顺序的,并且最小的主键值在前面

如此方式方便查询,只要最小的键值大于待查询的数据,则就不必继续查询下去

是按照链表方式存储

最后每一个页也按照页的方式存储

如此就组成了B+树,所谓B+树:叶子结点中有冗余,包含了根结点的数据,并且子节点之间具有双向指针链接

索引:高效的排好序的一种数据结构  B+树就一种主键索引

INodeDB  主键方便生成B+树  主键索引又叫做聚集索引(聚簇索引) 物理顺序与主键所在的列值逻辑顺序是相同的

非聚集索引:索引顺序与物理顺序无关.

 

**1无法查找

索引时必须给定最左端的数据 1**

 

1*1时,需要使用到索引条件

是否走索引块mysql会自身判断何种耗时最少,回表次数最少为原则

### B+的工作原理 MySQL 中的 B+ 是一种自平衡的结构,专为磁盘存储设计,以减少 I/O 操作次数并提高查询效率。B+ 的所有数据都存储在叶子节点中,而非叶子节点仅用于索引导航[^2]。这种结构使得 B+ 相比传统的 B 具有更高的性能优势。 #### 1. **层级更少** 由于每个非叶子节点可以存储更多的键值和指针,B+ 的高度通常比 B 更低。这意味着从根节点到叶子节点的路径更短,从而减少了查找数据所需的 I/O 次数。 #### 2. **查询速度稳定** 在 B+ 中,所有数据记录都位于叶子节点上,并且这些叶子节点通过指针连接成一个有序链表。因此,无论查找哪个关键字,都需要访问相同数量的节点,保证了查询时间的一致性和稳定性。 #### 3. **支持范围查询** B+ 的叶子节点构成一个有序链表,这使得它非常适合处理范围查询(如 `WHERE id BETWEEN 100 AND 200`)。数据库可以通过遍历叶子节点链表快速获取满足条件的数据范围。 #### 4. **高效的全表扫描** 与 B 不同,B+ 只需要遍历所有叶子节点即可完成对整棵的扫描,而无需逐层访问每个节点。这对于执行全表扫描操作非常有利,尤其是在大数据量的情况下。 --- ### B+ MySQL 中的应用 在 MySQL 的 InnoDB 存储引擎中,B+ 是实现主键索引(聚集索引)和二级索引的主要数据结构[^4]。 #### 1. **聚集索引(Clustered Index)** InnoDB 表的数据组织方式是按主键顺序将数据行存储在 B+ 的叶子节点中。这种结构称为“索引组织表”,意味着表中的每一行数据都直接与主键关联。如果没有显式定义主键,InnoDB 会自动选择一个唯一且非空的列作为隐式主键,或者生成一个隐藏的内部 ID 来构建聚集索引。 #### 2. **二级索引(Secondary Index)** 除了主键索引外,用户还可以为其他列创建二级索引。二级索引的叶子节点并不直接存储数据行,而是存储对应的主键值。当使用二级索引进行查询时,首先定位到主键值,然后回表(即再次访问聚集索引)获取完整的数据行。 #### 3. **页(Page)机制** InnoDB 的最小存储单元是“页”,大小通常为 16KB。无论是数据页还是索引页,都是按照 B+ 结构组织的。非叶子节点只包含键值和指针,而叶子节点则包含实际的数据记录或指向数据记录的指针[^4]。 #### 4. **磁盘预读优化** 为了提升性能,InnoDB 利用了磁盘预读机制。每个节点的大小被设置为一个页的大小,这样每次 I/O 操作只需加载一个完整的节点到内存中,减少了磁盘访问次数[^3]。 #### 5. **二分查找与指针跳转** 在 B+ 的非叶子节点中,键值是以排序后的形式存储的。查找过程中,可以通过二分查找法快速定位目标键所在的子节点,并通过指针跳转到下一个层级,最终到达存放数据的叶子节点[^4]。 --- ### 示例:B+ 的查找过程 假设我们有一个主键为 `id` 的表,其聚集索引是一棵 B+ 。当我们执行如下 SQL 查询: ```sql SELECT * FROM users WHERE id = 123; ``` InnoDB 引擎会从 B+ 的根节点开始,依次向下查找,直到找到包含 `id=123` 的叶子节点,然后返回该行数据。 如果是二级索引查询: ```sql SELECT * FROM users WHERE email = 'user@example.com'; ``` 系统会先在二级索引中查找对应的主键值,再根据主键值回到聚集索引中查找完整数据行。 --- ### 总结 MySQL 中的 B+ 索引通过层级较少、稳定的查询性能、高效的支持范围查询和全表扫描等特性,在数据库系统中扮演着至关重要的角色。它不仅提升了查询效率,还优化了磁盘 I/O 操作,是现代关系型数据库高性能的关键基础之一。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值