B(balance)树的特点:
- 任何一个关键字出现且只出现在一个节点中
- 每个节点都存储多个值,且每个值都是排序的
B+树是B树的变体,也是多路搜索树其特点:
-
拥有B树的特点
-
所有关键字存储在叶子节点,并且排好顺序
-
所有叶子节点之间有链指针进行连接
区别: -
因为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+树?
- 创建索引的目的是为了提高搜索效率,而B+树通过对数据进行排序可以提高查询效率。而且B+树的一个节点可以存储多个值,使得B+树的高度不会太高,减少创建索引的内存消耗。
- 在Mysql中一个InnoDB页就是一个B+树的节点,一个InnoDB页大小为16K,所以在一般情况下一棵三层的B+树就可以存储2000万行(假设主键为bigint + 指针时)左右的数据。
- B+树的叶子节点存储了所有排序过的数据,并且叶子节点通过指针相连,方便全表查询、范围查找。
为什么不使用B树,而使用B+树?
B树的所有节点都存储了数据与键值,因此非叶子节点能存储的指针数量就更少,当保存同等数据量的情况下,B树就只能增加树的高度,导致磁盘IO次数增多,使得查询效率减慢。