理解,為什么選擇B+Tree做數據庫的索引
-
二分查找法
在有序數組中查找某一特定元素,折半查找。O(logn)
很明顯,對于無序的數據建立索引并不適合。 -
Binary Search Tree 二叉查找樹
二叉查找樹的時間復雜度為O(log n),但是最壞情況下是O(n),不平衡。
二叉查找樹不適合作為索引的原因:- IO不好:平衡問題,節點數據少深度高;(AVL樹,紅黑樹)
- 范圍查找不好;
-
B-Tree B樹
B樹解決的問題:IO (平衡 + 節點數據多深度小)
B樹沒有解決的問題:范圍查找 -
B+Tree
B+Tree是B-Tree的變種。
1)節點可以存放更多的key(數據地址只放在葉子節點上)
2)葉子節點雙向相連接,方便范圍查找。 -
B+Tree索引區別
MySQL不同的存儲引擎的B+Tree索引也不太一樣。
MyISAM:葉子節點存放數據的地址; 索引和數據分離
InnoDB:葉子節點存放實際的數據;
InnoDB默認按照主鍵的順序來存放記錄,輔助索引的葉子節點數據是相應的主鍵;
聚集索引:索引中鍵值的邏輯順序決定了表中相應行的物理順序。 (葉子節點存數據)
非聚集索引:索引的邏輯順序與磁盤上行的物理存儲順序不同。 (葉子節點存地址) 備注
碼農翻身學習,B+樹定義好像不太一樣,重在理解選擇過程。
@夢工廠 2018.3.14