一、前言
mysql索引基于什么结构? hash表或者B+树。B+树的实现细节是什么?B-树和B+树有什么区别?联合索引在B+树中如何存储?B-树和B+树都是很基础的概念。要明白什么是B+树,要先了解什么是B-树。需要注意的是B-树就是B树,中间的横线并不是减号。
数据库索引为什么要使用树存储?①树的查询效率高,②维持相对顺序。那为什么没有使用二叉查找树来实现呢?二叉查找树查询的时间复杂度是O(logN),性能已经很高了,莫非B树比它更快?其实从算法逻辑上将,二叉查找树的查询次数和比较次数都是最小的。但是我们要考虑磁盘IO。
数据库索引是存储在磁盘上的,当数据量比较大时索引的大小可能有几个G甚至更多。当我们利用索引查询的时候,显然不能把整个索引全部加载到内存中。能做的只有逐一加载每一个磁盘块,这里的磁盘块对应 索引树的节点。
一颗100万的节点的平衡二叉查找树,树高是20。一次查询可能访问20个数据块,在机械硬盘时代,从磁盘随机读一个数据块需要10ms左右的寻址时间。也就是说对于1个100万行的表,如果使用二叉树来存储,单独访问一行可能需要20个10ms的时间。
为了提升读磁盘的效率,就必须访问尽量少的数据块。那么就不能使用二叉树这种“瘦高”的树。而应该使用“矮胖”的N叉树。这就是B-树的特征之一。
二、B树
B树是一种多路平衡查找树,它的每一个节点最多包含k个孩子,k被称为B树的阶,k的大小取决于磁盘块的大小。下面来具体介绍一下B-树(Balance Tree),一个m阶的B树具有如下几个特征:
1.根结点至少有两个子女。
2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
下面以一个3阶B-树为例,来看一下B-树的具体结构。树中的具体元素和刚才的二叉查找树是一样的。
来看(2,6)节点,该节点有2个元素2和6,又有3个孩子1,(3,5),8。其中1小于元素2,(3,5)在元素(2,6)之间,8大于(3,5)。正好符合刚才所列的几条特征。
三、B树查询
演示一下B树的查询过程。假如我们要查询的数值是5。
第一次磁盘IO