1. 程式人生 > >資料庫索引為什麼B樹結構

資料庫索引為什麼B樹結構

這是一個很深的問題,我採用逐步問答的方式來解答。試圖用最簡潔的語言解決整體概念上的問題。

本文目的純粹是提供對“索引採用B樹結構”這個問題的一種入門概念,不涉及深入的東西。

資料庫索引為什麼會選擇B樹結構?

答:因為使用B樹查詢時,所用的磁碟IO操作次數比平衡二叉樹更少,效率也更高。

為什麼使用B樹查詢所用的磁碟IO操作次數比平衡二叉樹更少?

答:大規模資料儲存中,樹節點儲存的元素數量是有限的(如果元素數量非常多的話,查詢就退化成節點內部的線性查找了),這樣導致二叉查詢樹結構由於樹的高度過大而造成磁碟I/O讀寫過於頻繁,進而導致查詢效率低下。那麼我們就需要減少樹的高度以提高查詢效率。而平衡多路查詢樹結構B樹就滿足這樣的要求。B樹的各種操作能使B樹保持較低的高度,從而達到有效減少磁碟IO操作次數。

什麼是B樹?B樹有什麼特徵?
答:一棵度為m(也稱為m階,m為給定數)的B-樹,它滿足:
(1)每個結點的子結點個數≤m;
(2)根結點若不是葉子結點,它至少有兩個子結點;
(3)除根和葉子結點外,每個結點的子結點個數≥   ceil(m/2);(注:ceil為向上取整函式)
(4)所有的葉子結點都出現在同一層,而且不帶有資訊;

(5)非葉子結點若具有j+1個子結點,那麼它包含j個關鍵字。其中,j≤m-1。

B樹的查詢是如何實現的?
答:在給定的m階B樹中查詢一個給定值v相等的關鍵字,必須從根結點開始進行查詢。
B樹應用於檔案系統的動態索引結構,這些結點儲存於外部儲存裝置上。當一個結點從外存調入記憶體後,我們可就這個結點的關鍵字序列,使用順序查詢(m較小時),或使用二分查詢( m較大時)。
      假若當前被查詢的結點中有j個關鍵字,那麼,在查詢等於給定值v的關鍵字時,會有如下可能:
(1)若v==ki (1≤i≤j),則查詢成功。
(2)若v < k1  ,則
① 如果p0為空,那麼查詢失敗;
② 如果p0非空,那麼從外存取得p0所指的結點,再繼續進行查詢。
(3)若ki
① 如果pi為空,那麼查詢失敗;
② 如果pi非空,那麼從外存取得pi所指的結點,再繼續進行查詢。
(4)若kj
① 如果pj為空,那麼查詢失敗;

② 如果pj非空,那麼從外存取得pj所指的結點,再繼續進行查詢。

既然查詢效率與樹的高度緊密相關,那麼B樹的高度由什麼決定?
答:若n≥1,m≥3,則對任意一棵具有n個關鍵字的m階B樹,其樹高h至多為:logt((n+1)/2)+1。

這裡t是每個(除根外)內部結點的最小度數,即B-樹的高度為O(logtn)。

給個B樹效能分析具體例子唄?
答:首先須知:n個結點的二叉平衡的高度H(即lgn)比B樹的高度h約大lgt倍,t為B樹內部結點的最小度數ceil(m/2)。

若階m=1024,則lgt=lg512=9。此時若B樹高度為4,則平衡的二叉排序樹的高度約為36。顯然,若m越大,則B樹高度越小。

若要作為記憶體中的查詢表,B樹的表現還要比二叉平衡樹好嗎?
答:非也。若要作為記憶體中的查詢表,B樹卻不一定比平衡的二叉排序樹好,尤其當m較大時更是如此。

因為查詢等操作的CPU計算時間在B樹上是O(mlogtn)=O(lgn·(m/lgt)), 而m/lgt>1,所以m較大時O(mlogtn)比平衡的二叉排序樹上相應操作的時間O(lgn)大得多。

因此,僅在記憶體中使用的B樹必須取較小的m。(通常取最小值m=3,此時B樹中每個內部結點可以有2或3個孩子,這種3階的B樹稱為2-3樹)。