B树与B+树的区别,为什么Mysql要使用B+树

B(balance)树的特点:

  • 任何一个关键字出现且只出现在一个节点中
  • 每个节点都存储多个值,且每个值都是排序的
    image.png

B+树是B树的变体,也是多路搜索树其特点:

  • 拥有B树的特点

  • 所有关键字存储在叶子节点,并且排好顺序

  • 所有叶子节点之间有链指针进行连接
    image.png
    区别:

  • 因为B+树的内部节点不存储数据,所有 data 均存储在叶子节点上,导致了查询的时间复杂度固定为O(log n)。而B-树查询时间复杂度不固定,与 key 在树中的位置有关,最好情况下为O(1)。

  • B+树的叶子节点通过链指针两两相连,更便于区间访问,可进行范围查询。而B树每个节点的key与data是在一起的,则无法区间查找。

  • B+树更适合外部存储。由于内节点无 data 域,每个节点能索引的范围更大更精确。由于B树每个节点均存储了key与data域,而B+树只有叶子节点存储key与data域,非叶子节点只是索引值,不占实际数据。使得B+树在一次IO中可以读取更多的索引值。

为什么Mysql索引使用B+树?

  1. 创建索引的目的是为了提高搜索效率,而B+树通过对数据进行排序可以提高查询效率。而且B+树的一个节点可以存储多个值,使得B+树的高度不会太高,减少创建索引的内存消耗。
  2. 在Mysql中一个InnoDB页就是一个B+树的节点,一个InnoDB页大小为16K,所以在一般情况下一棵三层的B+树就可以存储2000万行(假设主键为bigint + 指针时)左右的数据。
  3. B+树的叶子节点存储了所有排序过的数据,并且叶子节点通过指针相连,方便全表查询、范围查找。
为什么不使用B树,而使用B+树?

B树的所有节点都存储了数据与键值,因此非叶子节点能存储的指针数量就更少,当保存同等数据量的情况下,B树就只能增加树的高度,导致磁盘IO次数增多,使得查询效率减慢。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值