【mysql学习篇】为什么mysql用B+Tree?

1. 各种数据结构的对比

二叉树

  1. 不会平衡树节点,如果插入一组递增的数值,会导致树的高度很高,查询起来非常耗时

假设{1,2,3,4,5,6 } 一组数据需要存储,那么他的树的高度就为6
在这里插入图片描述

红黑树(二叉平衡树)

  1. 虽然实现了平衡节点,但是每个节点只能存储一个元素的结构还是会导致树高度很高,不如B树和B+树的索引文件页的方式存储
    在这里插入图片描述

B树

  1. 每个节点都会存储 data数据(每个节点存储容量就大了),这样每个文件页能存储的索引数就相对来说少了很多

B + Tree

  1. 非叶子节点存储的是冗余的索引字段,只有叶子节点才存储data数据这样每一页文件页能存储的索引就大大的提升了,对应的树的高度也得到了优化
  2. 叶子节点用指针连接,提高区间访问的效率
    在这里插入图片描述

2. 为什么mysql用B+Tree?

  1. B树和B+Tree每一个节点实际上可以理解为是一个文件页 mysql默认给一个文件页分配16k存储
  2. B树的每个节点都会存储data数据,而B+Tree的话非叶子节点是存储的索引(冗余),不存储data数据,这样每一页文件页能存储的节点就很多,树的高度就可以得到很好的控制,树的高度越高,从磁盘load节点到内存对比的次数就会越多,磁盘I/O是费时
  3. 所以B+Tree在树高度相同的情况下能够存储更多的索引数据,间接的减少了磁盘的I/O操作,B+Tree的I/O次数会更加稳定一些。
  4. 还有就是从范围查询的角度上来说B+Tree也具备绝对的优势,因为B+Tree在每个相邻的叶子节点之间都有互相指向
  5. B+Tree在全表扫描的情况下也是比较占优势的,因为B+Tree的数据都是存储在非叶子节点的,所以只需要扫描叶子节点就可以拿到全部数据了,B Tree的话就需要从头遍历整颗树

查看mysql文件页大小(16K):

SHOW GLOBAL STATUS like 'Innodb_page_size’

3. 为什么不推荐修改mysql一个文件页默认分配的大小?

  1. 每次查找数据都需要把依次索引文件页load到内存进行比较,一个系统会有很多数据库很多表,如果每个文件页的大小设置过大的话,那么就给内存带来了很大的压力,这个值是mysql多次测试得到的最优的大小,一般不推荐修改
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java学习者柯十一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值