https://www.jianshu.com/p/cf7dba86c391
B树,(B-Tree) 是一种多路查找树, 2-3树和2-3-4树都是B树的特列。 节点最大的孩子数目称为B树的阶。
数据库索引为什么会选择B树结构?
答:因为使用B树查找时,所用的磁盘IO操作次数比平衡二叉树更少,效率也更高。
为什么使用B树查找所用的磁盘IO操作次数比平衡二叉树更少?
答:大规模数据存储中,树节点存储的元素数量是有限的(如果元素数量非常多的话,查找就退化成节点内部的线性查找了),
这样导致二叉查找树结构由于树的高度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下
。那么我们就需要减少树的高度以提高查找效率。而平衡多路查找树结构B树就满足这样的要求。
B树的各种操作能使B树保持较低的高度,从而达到有效减少磁盘IO操作次数。
如一棵t=1000的B树,哪怕高度只有2,也可以存放1000^3=10亿以上的关键字,也就是说哪怕你有这么海量的数据,要查找、插入、删除其中的一个也只需要至多2次的磁盘IO(根节点是常驻内存的)。
这也是各大IT公司面试常常问到的问题——海量数据问题。以前通常回答二级索引,即一级索引常驻内存,通过一级索引找到二级索引,读入内存,再通过二级索引找到最终要找的具体数据,而“索引”,一直设想的都是HASH,现在回头想来,HASH其实是不合适的。因为HASH只能提供映射,而不能提供范围信息。这个问题的正确答案应该是B树或者B+树。
B+树是B树的变种。
B树是像2-3树那样把数据分散到所有的结点中,而B+树的数据都集中在叶结点,上层结点只是数据的索引,并不包含数据信息
1、为什么说B+-tree比B 树更适合实际应用中操作系统的文件索引和数据库索引?
数据库索引采用B+树的主要原因是 B树在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。正是为了解决这个问题,B+树应运而生。
B+树只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树需要遍历整棵树,效率太低。
2、B+-tree的应用: VSAM(虚拟存储存取法)文件
"MySQL 底层存储是用B+树实现的,因为在内存中B+树是没有优势的,但是一到磁盘,B+树的威力就出来了"。
B+树是B树的变形,它把所有的附属数据都放在叶子结点中,只将关键字和子女指针保存于内结点,内结点完全是索引的功能,最大化了内结点的分支因子。不过是n个关键字对应着n个子女,子女中含有父辈的结点信息,叶子结点包含所有信息(内结点包含在叶子结点中,内结点没有指向“附属数据”的指针必须索引到叶子结点)。这样的话还有一个好处就是对于每个结点所需的索引次数都是相等的,保证了稳定性。
B*树是B+树的变体,在B+树非根和非叶子结点再增加指向兄弟的指针;
一般关系型数据库使用B+树来做索引,NoSQL数据库用哈希来做索引