【面试现场】为什么MySQL数据库要用B+树存储索引?https://www.sohu.com/a/280609547_818692
hash索引o(1) B+树索引 o(logn)
为什么红黑树出现了,因为防止某些情况下二叉排序树退化为链表——诞生了二叉排序平衡树——树的性能取决于树的高度
为什么DB要用M路B树,为了再降低树的高度,减少db 磁盘io 次数,如果在内存中,红黑树效率更高
为什么M不能无限大,因为会退化成有序数组,无法一次载入内存,B树则可以一次加载一个节点
B+树在B树的基础上,(1)仅在叶子节点存放数据——B树高度更大;(2)同时叶子节点链表——避免跨层范围查找
为什么不用hash索引:
(1)select范围
(2) 不能排序
(3)索引一般是在磁盘上,数据量大的情况可能无法一次装入内存,分批的话比B+树io次数多的多,B+树的设计可以允许数据分批加载,同时树的高度较低,磁盘io次数少,提高查找效率
(4)hash冲突退化为遍历
还有一篇文章,
面试官:为什么MySQL的索引要使用B+树,而不是其它树?比如B树?
https://www.cnblogs.com/sujing/p/11110292.html
1、B-Tree因为非叶子结点也保存具体数据,所以在查找某个关键字的时候找到即可返回。而B+Tree所有的数据都在叶子结点,每次查找都得到叶子结点。所以在同样高度的B-Tree和B+Tree中,B-Tree查找某个关键字的效率更高。
2、由于B+Tree所有的数据都在叶子结点,并且结点之间有指针连接,在找大于某个关键字或者小于某个关键字的数据的时候,B+Tree只需要找到该关键字然后沿着链表遍历就可以了,而B-Tree还需要遍历该关键字结点的根结点去搜索。
3、由于B-Tree的每个结点(这里的结点可以理解为一个数据页)都存储主键+实际数据,而B+Tree非叶子结点只存储关键字信息,而每个页的大小有限是有限的,所以同一页能存储的B-Tree的数据会比B+Tree存储的更少。这样同样总量的数据,B-Tree的深度会更大,增大查询时的磁盘I/O次数,进而影响查询效率(针对聚簇索引主键索引)。