{為什麼使用b+樹?言簡意賅,就是因為:
1.檔案很大,不可能全部儲存在記憶體中,故要儲存到磁碟上
2.索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數(為什麼使用b-/+tree,還跟磁碟訪問原理有關。)
3.區域性性原理與磁碟預讀,預讀的長度一般為頁(page)的整倍數,(在許多作業系統中,頁得大小通常為4k)
4.資料庫系統巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入,(由於節點中有兩個陣列,所以位址連續)。而紅黑樹這種結構,h明顯要深的多。由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性
1. 索引在資料庫中的作用
在資料庫系統的使用過程當中,資料的查詢是使用最頻繁的一種資料操作。
最基本的查詢演算法當然是順序查詢(linear search),遍歷表然後逐行匹配行值是否等於待查詢的關鍵字,其時間複雜度為o(n)。但時間複雜度為o(n)的演算法規模小的表,負載輕的資料庫,也能有好的效能。 但是資料增大的時候,時間複雜度為o(n)的演算法顯然是糟糕的,效能就很快下降了。
好在電腦科學的發展提供了很多更優秀的查詢演算法,例如二分查詢(binary search)、二叉樹查詢(binary tree search)等。如果稍微分析一下會發現,每種查詢演算法都只能應用於特定的資料結構之上,例如二分查詢要求被檢索資料有序,而二叉樹查詢只能應用於二叉查詢樹上,但是資料本身的組織結構不可能完全滿足各種資料結構(例如,理論上不可能同時將兩列都按順序進行組織),所以,在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法。這種資料結構,就是索引。
索引是對資料庫表 中乙個或多個列的值進行排序的結構。與在表 中搜尋所有的行相比,索引用指標 指向儲存在表中指定列的資料值,然後根據指定的次序排列這些指標,有助於更快地獲取資訊。通常情 況下 ,只有當經常查詢索引列中的資料時 ,才需要在表上建立索引。索引將占用磁碟空間,並且影響數 據更新的速度。但是在多數情況下 ,索引所帶來的資料檢索速度優勢大大超過它的不足之處。
2. b+樹在資料庫索引中的應用
目前大部分資料庫系統及檔案系統都採用b-tree或其變種b+tree作為索引結構
1)在資料庫索引的應用
在資料庫索引的應用中,b+樹按照下列方式進行組織 :
① 葉結點的組織方式 。b+樹的查詢鍵 是資料檔案的主鍵 ,且索引是稠密的。也就是說 ,葉結點 中為資料檔案的第乙個記錄設有乙個鍵、指針對 ,該資料檔案可以按主鍵排序,也可以不按主鍵排序 ;資料檔案按主鍵排序,且 b +樹是稀疏索引 , 在葉結點中為資料檔案的每乙個塊設有乙個鍵、指針對 ;資料檔案不按鍵屬性排序 ,且該屬性是 b +樹 的查詢鍵 , 葉結點中為資料檔案裡出現的每個屬性k設有乙個鍵 、 指針對 , 其中指標執行排序鍵值為 k的 記錄中的第乙個。
② 非葉結點 的組織方式。b+樹 中的非葉結點形成 了葉結點上的乙個多級稀疏索引。 每個非葉結點中至少有ceil( m/2 ) 個指標 , 至多有 m 個指標 。
2)b+樹索引的插入和刪除
①在向資料庫中插入新的資料時,同時也需要向資料庫索引中插入相應的索引鍵值 ,則需要向 b+樹 中插入新的鍵值。即上面我們提到的b-樹插入演算法。
②當從資料庫中刪除資料時,同時也需要從資料庫索引中刪除相應的索引鍵值 ,則需要從 b+樹 中刪 除該鍵值 。即b-樹刪除演算法
為什麼使用b-tree(b+tree)
二叉查詢樹進化品種的紅黑樹等資料結構也可以用來實現索引,但是檔案系統及資料庫系統普遍採用b-/+tree作為索引結構。
一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級,所以評價乙個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟i/o操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。為什麼使用b-/+tree,還跟磁碟訪問原理有關。
區域性性原理與磁碟預讀
由於儲存介質的特性,磁碟本身訪問就比主存慢很多,再加上機械運動耗費,磁碟的訪問速度往往是主存的幾百分分之一,因此為了提高效率,要儘量減少磁碟i/o。為了達到這個目的,磁碟往往不是嚴格按需讀取,而是每次都會預讀,即使只需要乙個位元組,磁碟也會從這個位置開始,順序向後讀取一定長度的資料放入記憶體。這樣做的理論依據是電腦科學中著名的區域性性原理:
當乙個資料被用到時,其附近的資料也通常會馬上被使用。
程式執行期間所需要的資料通常比較集中。
由於磁碟順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有區域性性的程式來說,預讀可以提高i/o效率。
預讀的長度一般為頁(page)的整倍數。頁是計算機管理儲存器的邏輯塊,硬體及作業系統往往將主存和磁碟儲存區分割為連續的大小相等的塊,每個儲存塊稱為一頁(在許多作業系統中,頁得大小通常為4k),主存和磁碟以頁為單位交換資料。當程式要讀取的資料不在主存中時,會觸發乙個缺頁異常,此時系統會向磁碟發出讀盤訊號,磁碟會找到資料的起始位置並向後連續讀取一頁或幾頁載入記憶體中,然後異常返回,程式繼續執行。
我們上面分析b-/+tree檢索一次最多需要訪問節點:
h =資料庫系統巧妙利用了磁碟預讀原理,將乙個節點的大小設為等於乙個頁,這樣每個節點只需要一次i/o就可以完全載入。為了達到這個目的,在實際實現b- tree還需要使用如下技巧:
每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個node只需一次i/o。
b-tree中一次檢索最多需要h-1次i/o(根節點常駐記憶體),漸進複雜度為o(h)=o(logmn)。一般實際應用中,m是非常大的數字,通常超過100,因此h非常小(通常不超過3)。
綜上所述,用b-tree作為索引結構效率是非常高的。
而紅黑樹這種結構,h明顯要深的多。由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性,所以紅黑樹的i/o漸進複雜度也為o(h),效率明顯比b-tree差很多。
資料庫索引為什麼B樹結構
這是乙個很深的問題,我採用逐步問答的方式來解答。試圖用最簡潔的語言解決整體概念上的問題。本文目的純粹是提供對 索引採用b樹結構 這個問題的一種入門概念,不涉及深入的東西。資料庫索引為什麼會選擇b樹結構?答 因為使用b樹查詢時,所用的磁碟io操作次數比平衡二叉樹更少,效率也更高。為什麼使用b樹查詢所用...
為什麼要用資料庫連線池?
對於乙個簡單的資料庫應用,由於對於資料庫的訪問不是很頻繁。這時可以簡單地在需要訪問資料庫時,就新建立乙個連線,用完後就關閉它,這樣做也不會帶來什麼明顯的效能上的開銷。但是對於乙個複雜的資料庫應用,情況就完全不同了。頻繁的建立 關閉連線,會極大的減低系統的效能,因為對於連線的使用成了系統效能的瓶頸。連...
資料庫 為什麼選擇B 樹作為資料庫索引結構?
首先,來談談b樹。為什麼要使用b樹?我們需要明白以下兩個事實 事實1 不同容量的儲存器,訪問速度差異懸殊。以磁碟和記憶體為例,訪問磁碟的時間大概是ms級的,訪問記憶體的時間大概是ns級的。有個形象的比喻,若一次記憶體訪問需要1秒,則一次外存訪問需要1天。所以,現在的儲存系統,都是分級組織的。最常用的...