1. 程式人生 > >為什麼說B+-tree比B 樹更適合實際應用中作業系統的檔案索引和資料庫索引?

為什麼說B+-tree比B 樹更適合實際應用中作業系統的檔案索引和資料庫索引?

B樹:



B+樹


1) B+-tree的磁碟讀寫代價更低

B+-tree的內部結點並沒有指向關鍵字具體資訊的指標。因此其內部結點相對B 樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多。一次性讀入記憶體中的需要查詢的關鍵字也就越多。相對來說IO讀寫次數也就降低了。

舉個例子,假設磁碟中的一個盤塊容納16bytes,而一個關鍵字2bytes,一個關鍵字具體資訊指標2bytes。一棵9B-tree(一個結點最多8個關鍵字)的內部結點需要2個盤快。而B樹內部結點只需要1個盤快。當需要把內部結點讀入記憶體中的時候,B 樹就比B樹多一次盤塊查詢時間

(在磁碟中就是碟片旋轉的時間)

2) B+-tree的查詢效率更加穩定

由於非終結點並不是最終指向檔案內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查詢必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。

讀者點評
本文評論下第149樓,fanyy1991針對上文所說的兩點,道:個人覺得這兩個原因都不是主要原因。資料庫索引採用B+樹的主要原因是 B樹在提高了磁碟IO效能的同時並沒有解決元素遍歷的效率低下的問題。正是為了解決這個問題,B+樹應運而生。B+樹只要遍歷葉子節點就可以實現整棵樹的遍歷。而且在資料庫中基於範圍的查詢是非常頻繁的,而B樹不支援這樣的操作(或者說效率太低)。

摘自:http://blog.csdn.net/v_JULY_v/article/details/6530142/

檔案索引和資料庫索引為什麼使用B+樹,個人認為:
1. 因為檔案與資料庫都是需要較大的儲存——不可能全部儲存在記憶體中,故要儲存到磁碟上
2. 所謂索引,即是快速定位與查詢,那麼索引的結構組織要儘量減少查詢過程中磁碟I/O的存取次數(B+樹相比B樹,其非葉子節點佔用更小的空間,可以有更多非葉子節點存放在再記憶體中,減少大量的IO)
3. 區域性性原理與磁碟預讀,預讀的長度一般為頁(page)的整倍數,(在許多作業系統中,頁得大小通常為4k)
4. 資料庫系統巧妙利用了磁碟預讀原理,將一個節點的大小設為等於一個頁,這樣每個節點只需要一次I/O就可以完全載入,(由於節點中有兩個陣列,所以地址連續)。而紅黑樹這種結構,h明顯要深的多。由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性
5. B+樹還有一個最大的好處,方便掃庫,B樹必須用中序遍歷的方法按序掃庫,而B+樹直接從葉子結點挨個掃一遍就完了,B+樹支援range-query非常方便,而B樹不支援。這是資料庫選用B+樹的最主要原因