B树、B+树、红黑树、二叉树、顺序表、哈希值详解

B树、B+树、红黑树、二叉树、数组、链表、哈希表详解

为什么MySQL要采用B+树来存储数据?

本文将详细分析各种存储结构的优缺点,以此来说明为什么MySQL采用B+树
众所周知 常见的存储结构有
数组 链表 哈希表 搜索二叉树 红黑树  B树 B+树

1 数组、链表


数组 查找时间复杂度O(1)
	优点:查找方便 (根据 初始地址+索引值 可以迅速定位)
	缺点:1 插入删除数据麻烦( 需要移动修改位置之后的所有元素 )
		 2 对存储空间有较大需求(需要一块连续的空间 并且 当数组过大,数组对象会直接保存在堆内存中的年老代
		 中,如果数组的就使用一次就不用了,垃圾回收也不好回收)

链表 查找时间复杂度O(n)
	优点:1 插入删除数据方便(直接修改结点的指针即可)
		 2 内存空间不需要连续 利用率比较大
	缺点:1 查找不方便(需要从头结点开始依次往下遍历)
		 2 空间占用大,需要额外的空间保存指针
		 

B树、B+树、红黑树、二叉树、顺序表、哈希值详解_第1张图片

2 哈希表

哈希表:时间复杂度O(1)
	java中map的底层原理就是哈希值,(数组+链表),根据 Hash(key)%数组的长度 计算出保存的位置,如果位置相同就转化为链表
	优点:查询数组确实快了 中和了数组和链表
	缺点:只能精确查询,不能模糊查询,这对于MySQL来说是致命的
	哈希表的原理详见:https://blog.csdn.net/dongfei2033/article/details/80709827

B树、B+树、红黑树、二叉树、顺序表、哈希值详解_第2张图片

3 搜索二叉树

搜索二叉树:  时间复杂度 O(log2(n))
	优点:查找速度比顺序表快
	缺点:会出现极端的情况,(每个结点只有一个指针不为空)如下图,此时二叉树就是单链表,查询速度下降,查找效率和树型有关

B树、B+树、红黑树、二叉树、顺序表、哈希值详解_第3张图片

4 红黑树

红黑树:
	红黑树是一种自平衡二叉树,
	优点:弥补了二叉搜索树的缺点,左右子树的高度差不会超过1,因此不会出现链表的情况
	缺点:当数据量很大时,搜索的深度很深,效率比较低

B树、B+树、红黑树、二叉树、顺序表、哈希值详解_第4张图片

5 M阶 B树

特点:
	1 是一种二叉搜索树
	2 除根节点外的所有非叶节点至少含有(M/2(向上取整)-1)个关键字,每个节点最多有M-1个关键字,并且以
	升序排列。所以M阶B树的除根节点外的所有非叶节点的关键字取值区间为[M/2-1(向上取整),M-1]
	3 每个结点最多有M-1个指针
	
优点:
	B树的每一个节点都包含key和value,因此经常访问的元素可能离根节点更近,因此访问也更迅速。

4阶B树

img

往B树中依次添加

6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4

6 M阶 B+树

B树的升级版
特点:
1 有n棵子树的非叶子结点中含有n个关键字(b树是n-1个),这些关键字不保存数据,只用来索引,所有数据都保存在叶子节点(b树是每个关键字都保存数据)。
2 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自
小而大顺序链接(叶子节点组成一个链表)。
3 所有的非叶子结点可以看成是索引部分,结点中仅含其子树中的最大(或最小)关键字。
4 通常在b+树上有两个头指针,一个指向根结点,一个指向关键字最小的叶子结点。
5 同一个数字会在不同节点中重复出现,根节点的最大元素就是b+树的最大元素

优点:
	1 所有的叶子结点使用链表相连,便于区间查找和遍历。B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。
	2 b+树的中间节点不保存数据,能容纳更多节点元素

img

你可能感兴趣的:(B树、B+树、红黑树、二叉树、顺序表、哈希值详解)