问题:MySQL中存储索引用到的数据结构是B+树,B+树的查询时间跟树的高度有关,是log(n),若是用hash存储,那么查询时间是O(1)。既然hash比B+树更快,为何mysql用B+树来存储索引呢?mysql
答:1、从内存角度上说,数据库中的索引通常时在磁盘上,数据量大的状况可能没法一次性装入内存,B+树的设计能够容许数据分批加载。sql
2、从业务场景上说,若是只选择一个数据那确实是hash更快,可是数据库中常常会选中多条这时候因为B+树索引有序,而且又有链表相连,它的查询效率比hash就快不少了。数据库
问题:为何不用红黑树或者二叉排序树?数组
答:树的查询时间跟树的高度有关,B+树是一棵多路搜索树能够下降树的高度,提升查找效率数据结构
问题:既然增长树的路数能够下降树的高度,那么无限增长树的路数是否是能够有最优的查找效率?设计
答:这样会造成一个有序数组,文件系统和数据库的索引都是存在硬盘上的,而且若是数据量大的话,不必定能一次性加载到内存中。有序数组无法一次性加载进内存,这时候B+树的多路存储威力就出来了,能够每次加载B+树的一个结点,而后一步步往下找,指针
问题:在内存中,红黑树比B树更优,可是涉及到磁盘操做B树就更优了,那么你能讲讲B+树吗?blog
B+树是在B树的基础上进行改造,它的数据都在叶子结点,同时叶子结点之间还加了指针造成链表。排序
下面是一个4路B+树,它的数据都在叶子结点,而且有链表相连。索引
问题:为何B+树要这样设计?
答:这个跟它的使用场景有关,B+树在数据库的索引中用得比较多,数据库中select数据,不必定只选一条,不少时候会选中多条,好比按照id进行排序后选100条。若是是多条的话,B+树须要作局部的中序遍历,可能要跨层访问。而B+树因为全部数据都在叶子结点不用跨层,同时因为有链表结构,只须要找到首尾,经过链表就能把全部数据取出来了。
好比选出7到19只须要在叶子结点中就能找到。