B-tree
看完记不住的辣鸡,只好抄一遍。
Mysql数据库的索引是基于Hash表或者B+树,因为树的查询效率高,而且可以保持有序。不适用二叉查找树(查询时间复杂度O(logN))的原因是,需要考虑磁盘IO的效率,数据库索引都存储在磁盘上(大小可能有几个G),利用索引进行查询的时候,不能将整个索引全部加载到内存,能做的只有逐一加载每一个磁盘页(一个磁盘页对应索引树的节点)。
要了解B+树必须先了解B-树(应用:非关系型数据库MongoDB)。
B-树是一种多路平衡查找树(优势:自平衡),每个节点最多m个孩子,m是B-树的阶,m的大小取决于磁盘页的大小(通常是4k)。
1:根节点至少2个孩子
2:每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
3:每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
4:所有叶子结点都位于同一层
5:每个节点中的元素都从小到大排列,系欸但当中k-1个元素正好是k个孩子包含的元素的值域划分
B+树的查询性能更高
1:有k个孩子的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2:所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3:所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。(形成了有序列表,方便进行范围查询)
卫星数据:索引元素所指向的数据记录,B-树中全都有(查询效率不稳定),B+树中只有叶子节点有(查询效率稳定)。
因此:同样大小的磁盘页,B+树能容纳更多的节点元素。(更矮胖,IO次数更少)
reference:漫画:什么是B-树? - 小灰的文章 - 知乎 https://zhuanlan.zhihu.com/p/54084335
漫画:什么是B+树? - 小灰的文章 - 知乎 https://zhuanlan.zhihu.com/p/54102723
浙公网安备 33010602011771号