Mysql_索引_B树与B+树

为什么索引可以减少IO次数和减少IO量,提高并发效率?

key值哪个文件offset偏移量

索引需要落盘,不然每次都需要重建索引

当索引文件足够大的时候会产生更多的IO

索引应该是使用key-value的格式存储,候选的保存key-value的有,hash表,二叉树,平衡二叉树,红黑树,B树,B+树,先来看看各种情况。

(1)如果用hash存储索引。必须设计好的hash算法;不能使用范围查询,需要挨个比较;浪费空间;

(2)如果使用二叉树,当插入的数据比较有序,二叉树退化成链表。

(3) 使用平衡二叉树,因为遵循严格的平衡,查询时一定满足二分查找,但插入时需不断调整树,损失插入的性能来提高查询的性能,适合多读的情况

(4)红黑树:近似平衡,插入性能和查询性能都能得到一定的提升。

(5)二叉树因为每个结点只有两个分支,当插入的data越来越多时,树的深度也加大,增加IO的瓶颈,进一步,考虑使用多叉树,以更少的层数存储更多的索引,如B树。接着引出B树和B+树的区别。

B树n阶数,最多能存放n-1条记录

局部性原理:

     数据有聚集成群的倾向,被查询的数据多数都存储在一起,而且和可能再次被查询

磁盘预读

    内存和磁盘交互的时候有一个最小的单元叫做页,默认情况下为4k或8k,mysql中的innodb和磁盘交互时读的16kb的数据。

B树的结构

树的存储结构

  • 节点的key,相当于索引
  • 节点的data,具体存储的数据
  • 节点的前指针,指向比当前key小的子节点(前后指针分别指向另一个磁盘块)
  • 节点的后指针,指向比当前key大的子节点
  • 缺点:因为data消耗磁盘空间比较大,一棵B树存储的记录数会比较少,如果我要读key为11的data,现在要把父亲所在的页都读取,产生大量的IO

B+树的结构

B+树的存储结构

  • 叶子节点增加了指向下一个节点的指针 
  • 每个节点的指针上限为2d,则不是2d+1
  • 非叶子节点不存储具体数据,只存储key;叶子节点不存储指针(可以从根到叶结点查找,也可以在底层挨个查找)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值