---
# System prepended metadata

title: 各種樹
tags: [Index研究]

---

###### tags: `Index研究`
# 各種樹

### Binary Search Tree
![](https://i.imgur.com/gGnIUCn.png)


### B-tree

![](https://i.imgur.com/FRuh7wc.png)

1. 每個節點(包括根節點)最多擁有m個子樹
2. 根節點至少有2個子樹()
3. 分支節點至少擁有m or 2顆子樹（除根節點和葉子節點外都是分支節點）
4. 所有葉子節點都在同一層、每個節點最多可以有m-1個key，並且以升序排列
5. B樹查詢時間的複雜度不是固定的，它與鍵在樹中的位置有關，最好是O1）。
### B+tree
![](https://i.imgur.com/wMdypJK.png)
1. 每個葉子節點都帶有指向下一個節點的指針，形成有序鏈表，加速範圍查詢
2. 只有葉子節點帶數據，父節點只帶關鍵字與指針，單一節點更省空間，讓查詢 I/O 變小
3. 所有的葉子節點都在同一層
4. 所有數據都存在葉節點使得查詢時間複雜度固定為O(log n) 
5. B+樹的葉子節點是通過雙向鍊表連結的，所以支持範圍查詢，且效率比B樹高

# 為什麼MongoDB使用B-Tree，而Mysql使用B+Tree ?

MongoDB 作為面向文檔的數據庫，與數據之間的關係相比，它更看重以文檔為中心的組織方式，所以選擇了查詢單個文檔性能較好的B樹，這個選擇對遍歷數據的查詢也可以保證可以接受的時延。

Mysql使用B+樹，數據在葉節點上,葉子節點之間又通過雙向鍊表連接,更加有利於數據遍歷，而MongoDB使用B樹,所有節點都有一個數據欄位。只要找到指定的索引，就可以對其進行訪問。毫無疑問，單個查詢MongoDB平均查詢速度比Mysql快。


{%hackmd theme-dark %}