B-Tree
B树是一种多路平衡搜索树,但是B树允许每个节点上可以存放更多的数据,也允许每个节点有更多的子节点
B树的特点:
- 所有的键值分布在整个树中
- 任何关键字只出现在1个节点中
- 搜索可能在非叶子节点中结束
- B-Tree 有一个度的概念,就是一个节点中最多存储的索引数据,如果达到这个度的 15/16的时候,就会分叉。
B+Tree
B+Tree是B树的变种
B+Tree特点
- 数据都存储在叶子节点,非叶子节点不存储真正的数据
- 非叶子节点中的数据,都能在叶子节点中找到(关键字有可能出现在2处)。
- 为所有的叶子节点增加了一个链指针
为什么用B+Tree
-
Mysql是基于磁盘的数据库,索引是以索引文件存在于磁盘中,索引的查找就会涉及到磁盘的IO,
磁盘的IO消耗要比内存的IO消耗高几个数量级,所以查询索引的时候,要尽量减少IO的次数 -
局部性原理与磁盘预读
为了提升效率,要尽量减少磁盘IO的次数,实际中,磁盘并不是每次都是按需读取,而是每次都会预读,磁盘读取完数据后,再会多读一部分数据到磁盘中。这样的理论依据是计算机科学中的局部性原理
局部性原理:
1)当一个数据被用到时,其周围的数据也会马上被用到
2) 程序运行期间所需要的数据通常比较集中 -
减少寻道时间,只需要很少的旋转时间
磁盘顺序读取的效率很高,而且B+Tree中的数据都存在叶子节点,并且叶子节点中的数据都是连续的,所以预读的时候,不需要寻道时间,只需要很少的旋转时间
磁盘存取原理:1:寻道时间(速度慢,费时) 2:旋转时间(速度较快)
-
Mysql(默认InnoDB存储引擎),将记录按照页的方式存储,每页默认16K(大小可以修改),Linux是4K
B+Tree的优势
1)B+Tree更适合磁盘存储,因为非叶子节点不存储数据,所以一个节点存储的数据量更大,IO效率更高,一次IO的数据量更大
2)Mysql是关系型数据库,经常会按照区间来访问某个搜索列,B+Tree的叶子节点增加了链指针,将强了区间访问性,所以B+Tree更适合范围查找