B树
B树
FANSEAB树
如何选择数据库的数据结构?
两个衡量性能的重要指标:
- 读写文件大小
- IO次数
树的深度影响IO次数,
- 线性表
查找速度:慢
插入删除:插入删除性能消耗高
- 哈希表
查找速度:不够快
插入删除:快
缺点:hash表容易产生hash冲突,数据散列不均匀,仍会产生大量线性查询,但相比线性表会好很多。范围查询就需要挨个遍历
- 二叉查找树
查找速度:大部分情况很快
插入删除:快
缺点:容易退化成链表,又回到线性查找的速率
- 平衡二叉树(AVL)
查找速度:快快快快
插入删除:慢
缺点:查询深度降低,但是插入时增加了查询的时间消耗
- 红黑树
红黑树采取宏观的调整,最长子树不超过最短子树的两倍,否则做重新排序:这样相对于avl减小了插入消耗!
查找速度:快快快快
插入删除:快
缺点:虽然他的查找速度很快,而且插入速度也得到了提升,但是随着文件量增多,红黑树深度也会随着变深,依然会增加IO读取次数!
- B树
查找速度:快到飞起!
插入删除:快!
舍弃二叉树的概念而选择多子树,有效的降低了树的深度,并继承了树的优点,查询速度很快!
B树结构
本质是多级树,一个节点能存储多个数据,m叉树代表一个节点最多有m分支
关键字:n-1个;子节点则为n
B+树结构
B树效果这么好,还有啥缺点不,怎么优化?
磁盘数据是按页存储的,一个节点的空间占16k,如果节点上还保存了数据内容,那么一个节点能保存的数据key将会大大减少!这会使得IO次数增加
这就不得不提B+树了,B+树的非叶子节点都只保存key和指针,完完全全成为了路标,将key和数据分离了出来,仅仅在叶子结点保存了数据,这样每一页的节点能保存上千条key,提高IO效率,性能非常惊人!
B+树是B树的变形,是在B树基础上优化的多路平衡搜索树,B+树的规则跟B树基本类似,但是又在B树的基础上做了以下几点改进优化:
- 分支节点的子树指针与关键字个数相同。
- 分支节点的子树指针p[i]指向关键字值大小在[k[i],k[i+1])区间之间,这就说明B+树取消了最左边的那个子树
- 所有叶子节点增加一个链接指针链接在一起
- 所有关键字及其映射数据都在叶子节点出现。