B树和B+树索引

文章讨论了B树和B+树在数据库索引中的应用,指出B+树如何解决B树的缺点,如更均匀的磁盘IO次数,更高的索引存储效率以及支持范围搜索的能力。2000万数据构建的AVL树与500阶B树对比,显示B+树在降低层数和提高搜索效率上的优势。
摘要由CSDN通过智能技术生成

B树索引

磁盘IO读数据到内存

malloc/newkernel申请4B空间,实际系统可能给2个页面空间即8KB,剩下8KB-4B空间由 lib.solibc++.soptmalloctcmalloc管理 。这样就不需要每次去kernel申请内存

磁盘IO同理,我们读一部分数据会把一整块(16KB)的内容读下来,而不是需要多少读多少,一般会多读一些。

在这里插入图片描述

2000W数据构建AVL树,层数是25层(log2(2000W)),查找最多25次磁盘IO。二叉树是一个节点是数据域两个指针域

如果用500阶B树则只需要3层,即查找最多需要3次IO。500叉树就是499个数据域,500个指针域

使用索引查询流程/原理【面试题】

如 select * from student where uid=5;

执行流程:

  1. 检查uid有索引
  2. 然后去存储引擎请求kernel进行磁盘IO读取索引文件到内存上
  3. 最后用索引构建B树进行加速搜索

B+树索引

在这里插入图片描述

MySQL索引为什么最终是采用B+树呢?

因为B-树有如下缺点:

  • 索引+数据的内容分散在不同的节点上,离根节点近就搜索的快,离根节点远就搜的慢,花费的磁盘IO次数不平均,每一行数据搜索花费时间也不平均;
  • 每一个非叶节点上,不仅要存索引(key) 还要存储索引值所在行的data数据。导致一个节点能存的索引不够多;
  • B-树不方便做范围搜索,整表搜索也不方便。

与此对比,B+树有如下的特点:

  • 每一个非叶节点上,只存key,好处就是一个节点存的key更多,相同数据量层数可能更低,搜索的效率会有所提升;
  • 叶子节点存储了所有索引值,搜索每个索引对应的data值,都要到叶子节点上,这样每一行搜索的时间是比较平均的;
  • 在B-树上如果做区间查找,遍历的节点是非常多的,而B+树所有叶子节点被连接成了有序链表结构,因此做整表遍历和区间查找是非常容易的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值