MySQL 的B+树存储原理

  数据库存储的数据量非常大,一般存储在磁盘上。为了加快对数据的查询,需要通过对数据进行索引。索引是查询数据时的路标,通过将索引和数据进行分离,将索引放入在内存中,可以进一步提升查询速度。

  应该使用什么样的数据结构来构建索引呢?在计算机中,最基本的数据结构是数组和链表。数组可以通过索引在O(1)的时间复杂度定位到查询的数据,通过二分查找算法,查询一个普通的数据时间复杂度为O(logn),但数组的插入性能比较差,也很难申请到大容量的连续存储空间。链表插入性能好,不需要申请连续的存储空间,但查询性能差。为了支持链表的快速查询,通过将链表中的某些节点提取出来作为索引节点,通过父子节点的关系进行连接,于是设计出了树这种数据结构,二叉查找树就是支持二分查找算法的链表结构。为了实现数据的快速查询,设计出了二叉查找树、平稳二叉查询树、红黑树等数据结构。

  树有很好的查询性能,查询一个节点需要的时间与树的高度相关,但如果索引的数据量太大,内存中无法存储,就必须存储在磁盘中。如果树的高度太高,就要进行多次磁盘查询操作,如何降低树的高度呢? B+ 树是将树形索引的所有节点都存在磁盘上的高效检索方案,索引技术从此摆脱了内存空间的限制。

  磁盘是块存储结构,操作系统对磁盘数据的访问是以块为单位的。B+树的一个关键设计,就是让树的一个节点的大小等于一个块的大小。节点内存储的元素,不是一个元素,而是一个可以装m个元素的有序数组。B+树的另外一个设计,是非叶子节点只有索引数据和树形结构的指针,叶子节点存储具体的数据。这样非叶子节点就能存储更多的索引数据,一个3~4层的B+树就能索引几十T的数据了。B+树还将同层的节点串链起来形成双向链表,这样就具有了范围查询和灵活调整的能力。B+树每个节点内的数据通过二分查询算法进行查询。

  基于B+树的特点,Innodb的索引有如下特点:

  1、设计表时应该添加自增的主键索引。这种自增的索引在插入数据时可以直接插在磁盘块的页尾,否则在索引中间插入数据可能导致叶子节点的页分裂及索引节点的页分裂,导致插入性能降低;

  2、主键索引字段占用的字节空间应比较小。Innodb存储引擎的索引分主键索引和非主键索引。主键索引的叶子节点存储实际的数据,非主键索引的叶子节点存储主键索引的id值。如果主键空间占用太大,会导致非叶子节点能存储的索引数目减少,增加树的高度,也会导致非主键索引需要更多的存储空间;

  3、支持范围查询和前缀匹配模糊查询。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值