b樹是為了提高磁碟或外部儲存裝置查詢效率而產生的一種多路平衡查詢樹。
b+樹為b樹的變形結構,用於大多數資料庫或檔案系統的儲存而設計。
b樹相對於紅黑樹的區別
在大規模資料儲存的時候,紅黑樹往往出現由於樹的深度過大而造成磁碟io讀寫過於頻繁,進而導致效率低下的情況。為什麼會出現這樣的情況,我們知道要獲取磁碟上資料,必須先通過磁碟移動臂移動到資料所在的柱面,然後找到指定盤面,接著旋轉盤面找到資料所在的磁軌,最後對資料進行讀寫。磁碟io代價主要花費在查詢所需的柱面上,樹的深度過大會造成磁碟io頻繁讀寫。根據磁碟查詢訪問的次數往往由樹的高度所決定,所以,只要我們通過某種較好的樹結構減少樹的結構儘量減少樹的高度,b樹可以有多個子女,從幾十到上千,可以降低樹的高度。
b樹和b+樹的區別
1. b樹則所有節點都帶有帶有指向記錄(資料)的指標(rowid),b+樹中只有葉子節點會帶有指向記錄(資料)的指標(rowid)。因為b+樹它把所有的衛星資料(或指向資料的指標)都儲存在葉節點中,內部節點只存放關鍵字和孩子指標,不會帶上指向記錄的指標(rowid),這樣,乙個塊中可以容納更多的索引項,一是可以降低樹的高度。二是乙個內部節點可以定位更多的葉子節點(優點1)。
2. b+樹中每個葉子節點都包含指向下乙個葉子節點的指標。所有葉子節點都是通過指標連線在一起,而b樹不會。 葉子節點之間通過指標來連線,範圍掃瞄將十分簡單(優點2),而對於b樹來說,則需要在葉子節點和內部節點不停的往返移動。
b+樹還有乙個最大的好處,遍歷更加高效,方便掃庫(優點2),b樹必須用中序遍歷的方法按序掃庫,而b+樹直接從葉子結點挨個掃一遍就完了,b+樹支援range-query非常方便,而b樹不支援。這是資料庫選用b+樹的最主要原因。(b+樹的遍歷更加高效,b樹需要以中序的方式遍歷節點,而b+樹只需把所有葉子節點串成鍊錶就可以從頭到尾遍歷)。
3. b+樹每個節點的指標和key一樣多,b樹每個節點指標比key多1。
為什麼說b+比b樹更適合實際應用中作業系統的檔案索引和資料庫索引?
1) b+的磁碟讀寫代價更低
b+的內部結點並沒有指向關鍵字具體資訊的指標。因此其內部結點相對b樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的關鍵字也就越多。相對來說io讀寫次數也就降低了。
2) b+tree的查詢效率更加穩定
由於非葉子結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每乙個資料的查詢效率相當。
資料庫索引採用b+樹的主要原因是 b樹在提高了磁碟io效能的同時並沒有解決元素遍歷的效率低下的問題。正是為了解決這個問題,b+樹應運而生。b+樹只要遍歷葉子節點就可以實現整棵樹的遍歷。而且在資料庫中基於範圍的查詢是非常頻繁的,而b樹不支援這樣的操作(或者說效率太低)
各有優點:
b+樹的優點:
1. 非葉子節點不會帶上指向記錄的指標(rowid),這樣,乙個塊中可以容納更多的索引項,一是可以降低樹的高度。二是乙個內部節點可以定位更多的葉子節點。
2. 葉子節點之間通過指標來連線,範圍掃瞄將十分簡單,而對於b樹來說,則需要在葉子節點和內部節點不停的往返移動。
b樹的優點:
對於在內部節點的資料,可直接得到,不必根據葉子節點來定位。
B樹 B 樹 B 樹 B 樹 紅黑樹
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...
B樹 B 樹 B 樹 B 樹 紅黑樹
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...
B樹 B 樹 B 樹 B 樹 紅黑樹
b樹 即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中 否則,如果查詢關鍵字比結點關鍵字小,就進...