b+tree
链接:https://zhuanlan.zhihu.com/p/54102723
来源:知乎
![](https://pic3.zhimg.com/v2-b54fce722887cb7f0213b8a768ca3aeb_b.jpg)
![](https://pic4.zhimg.com/v2-8ff96670d2985e9c550f7b79e8177132_b.jpg)
![](https://pic3.zhimg.com/v2-c187b2bf38f9113c9b8d63bf2005f118_b.jpg)
![](https://pic4.zhimg.com/v2-100d662fb3796e6829888d17e29a964b_b.jpg)
一个m阶的B树具有如下几个特征:
1.根结点至少有两个子女。
2.每个中间节点都包含k-1个元素和k个孩子,其中 m/2 <= k <= m
3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m
4.所有的叶子结点都位于同一层。
5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。
![](https://pic3.zhimg.com/v2-311a1f22a8d4ee786def9f26b2cf889d_b.jpg)
一个m阶的B+树具有如下几个特征:
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
![](https://pic1.zhimg.com/v2-8adae1b704faf26d45f48e7b3e35015f_b.jpg)
![](https://pic3.zhimg.com/v2-3820251147f6f624b88d22da0bd82691_b.jpg)
![](https://pic4.zhimg.com/v2-678096c52709feddbdd03340069c6dc2_b.jpg)
![](https://pic3.zhimg.com/v2-e0f9f2ea05f4cd47aa8730ff01aab7e3_b.jpg)
![](https://pic1.zhimg.com/v2-4bb7806ef89205d92ed634202b8929f0_b.jpg)
![](https://pic4.zhimg.com/v2-d8b80c13d68de264b02e4cf9c3663dc9_b.jpg)
![](https://pic4.zhimg.com/v2-fecb45998981f5c7678ce7e761da2cef_b.jpg)
![](https://pic2.zhimg.com/v2-5569aff129b64a07ebb08d671e355953_b.jpg)
![](https://pic3.zhimg.com/v2-eeb81a82f1226e190c0f827a7047d563_b.jpg)
![](https://pic2.zhimg.com/v2-c5dc7c67fc97096e730ff6fd96a7b69a_b.jpg)
![](https://pic4.zhimg.com/v2-be692f1a07154cef99ed78954ff299da_b.jpg)
![](https://pic1.zhimg.com/v2-8f9fed7e9bb42c3d5edc537bc683757e_b.jpg)
![](https://pic2.zhimg.com/v2-d98e843830a722a8646909cf8429043c_b.jpg)
![](https://pic4.zhimg.com/v2-1b4d60fa559a4fb3f16b36b0b0c0bb6c_b.jpg)
B-树中的卫星数据(Satellite Information):
![](https://pic1.zhimg.com/v2-ba3efdd8525facefc81189ed6a958b4d_b.jpg)
![](https://pic1.zhimg.com/v2-a878d8ff6772e395bde3bc47078dd60a_b.jpg)
B+树中的卫星数据(Satellite Information):
![](https://pic2.zhimg.com/v2-36d5aa8eeb765d559ba8d5e136d0b402_b.jpg)
需要补充的是,在数据库的聚集索引(Clustered Index)中,叶子节点直接包含卫星数据。在非聚集索引(NonClustered Index)中,叶子节点带有指向卫星数据的指针。
![](https://pic3.zhimg.com/v2-54621b32b4ff8db8e06d4299bb44e59f_b.jpg)
![](https://pic2.zhimg.com/v2-1eef3ebc1ad7ca7569d24ed1d9f2584f_b.jpg)
![](https://pic1.zhimg.com/v2-ab7927ef3da77961144412d1e9a7aba4_b.jpg)
第一次磁盘IO:
![](https://pic1.zhimg.com/v2-a0751295d2d88b38ab7d8f08ce53043e_b.jpg)
第二次磁盘IO:
![](https://pic1.zhimg.com/v2-aeeec3ce80ddb42f6a99f1f898ac20f7_b.jpg)
第三次磁盘IO:
![](https://pic2.zhimg.com/v2-459b83dd4f0f0fa465e29c56eb155750_b.jpg)
![](https://pic4.zhimg.com/v2-433d77241a189a6e67cfc517c0f10384_b.jpg)
![](https://pic4.zhimg.com/v2-6192fd0fbc6adc8f9ae35670684799ad_b.jpg)
![](https://pic2.zhimg.com/v2-a67b0bc302f71d2b16ace9f75897d274_b.jpg)
![](https://pic1.zhimg.com/v2-4adcd0881b32490e9388cc3f50658e47_b.jpg)
![](https://pic1.zhimg.com/v2-0bcd0646793fb665c8be79ddbf6e7747_b.jpg)
![](https://pic2.zhimg.com/v2-80261d8f039e80a9469a79ed58ed2c49_b.jpg)
B-树的范围查找过程
自顶向下,查找到范围的下限(3):
![](https://pic1.zhimg.com/v2-c8e4acadc29898404733eb6d834fe5c1_b.jpg)
中序遍历到元素6:
![](https://pic1.zhimg.com/v2-6072ed36e6c9f61007100e118ca21484_b.jpg)
中序遍历到元素8:
![](https://pic2.zhimg.com/v2-34fa0f6fbb486b284410701fa91f9599_b.jpg)
中序遍历到元素9:
![](https://pic1.zhimg.com/v2-07f51bbd5c59331571d1c1d2d16631da_b.jpg)
中序遍历到元素11,遍历结束:
![](https://pic3.zhimg.com/v2-a5524fa13113640d63c732ed73c7d31b_b.jpg)
![](https://pic3.zhimg.com/v2-6652fe68bb98d06c3176a6f033eb444b_b.jpg)
![](https://pic2.zhimg.com/v2-5d8453796d5dfe2a33807fc811e9bcc3_b.jpg)
B+树的范围查找过程
自顶向下,查找到范围的下限(3):
![](https://pic2.zhimg.com/v2-1003e93d5e31d7c0af028b529dc70268_b.jpg)
通过链表指针,遍历到元素6, 8:
![](https://pic3.zhimg.com/v2-0e1ab53064956e2de75a24824e561207_b.jpg)
通过链表指针,遍历到元素9, 11,遍历结束:
![](https://pic2.zhimg.com/v2-dd536df0418e5480c9aa81a0e0d2e9cf_b.jpg)
![](https://pic1.zhimg.com/v2-7ac8eedd470004bb9cece189580da8ae_b.jpg)
![](https://pic4.zhimg.com/v2-e357f285777efe410ddf3aa017d7408d_b.jpg)
![](https://pic2.zhimg.com/v2-748f5656b2be2080409ae5acc38c98a1_b.jpg)
![](https://pic1.zhimg.com/v2-1036505e652e8a25ed402ba3e43f4952_b.jpg)
B+树的特征:
1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
B+树的优势:
1.单一节点存储更多的元素,使得查询的IO次数更少。
2.所有查询都要查找到叶子节点,查询性能稳定。
3.所有叶子节点形成有序链表,便于范围查询。
![](https://pic2.zhimg.com/v2-986da070c3e13e10d25e707c78092ba1_b.jpg)