由 B B 樹看 MySQL索引結構

2021-07-27 05:31:03 字數 1388 閱讀 5171

b-樹有如下特點:

所有鍵值分布在整顆樹中;

任何乙個關鍵字出現且只出現在乙個結點中;

搜尋有可能在非葉子結點結束;

在關鍵字全集內做一次查詢,效能逼近二分查詢;

b+樹是b-樹的變體,也是一種多路搜尋樹, 它與 b- 樹的不同之處在於:

所有關鍵字儲存在葉子節點出現,內部節點(非葉子節點並不儲存真正的 data)

為所有葉子結點增加了乙個鏈指標

簡化 b+樹 如下圖

紅黑樹等資料結構也可以用來實現索引,但是檔案系統及資料庫系統普遍採用b-/+tree作為索引結構。mysql 是基於磁碟的資料庫系統,索引往往以索引檔案的形式儲存的磁碟上,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。為什麼使用b-/+tree,還跟磁碟訪問原理有關。

由於磁碟的訪問速度與記憶體之間鴻溝,為了提高效率,要儘量減少磁碟i/o.磁碟往往不是嚴格按需讀取,而是每次都會預讀,磁碟讀取完需要的資料,會順序向後讀一定長度的資料放入記憶體。而這樣做的理論依據是電腦科學中著名的區域性性原理:

當乙個資料被用到時,其附近的資料也通常會馬上被使用

程式執行期間所需要的資料通常比較集中

由於磁碟順序讀取的效率很高(不需要尋道時間,只需很少的旋轉時間),因此對於具有區域性性的程式來說,預讀可以提高i/o效率.預讀的長度一般為頁(page)的整倍數。

mysql(預設使用innodb引擎),將記錄按照頁的方式進行管理,每頁大小預設為16k(這個值可以修改).linux 預設頁大小為4k

來自張洋的部落格:

實際實現b-tree還需要使用如下技巧:

每次新建節點時,直接申請乙個頁的空間,這樣就保證乙個節點物理上也儲存在乙個頁裡,加之計算機儲存分配都是按頁對齊的,就實現了乙個結點只需一次i/o。

假設 b-tree 的高度為 h,b-tree中一次檢索最多需要h-1次i/o(根節點常駐記憶體),漸進複雜度為o(h)=o(logdn)o(h)=o(logdn)。一般實際應用中,出度d是非常大的數字,通常超過100,因此h非常小(通常不超過3)。

而紅黑樹這種結構,h明顯要深的多。由於邏輯上很近的節點(父子)物理上可能很遠,無法利用區域性性,所以紅黑樹的i/o漸進複雜度也為o(h),效率明顯比b-tree差很多。

b+樹更適合外部儲存,由於內節點無 data 域,乙個結點可以儲存更多的內結點,每個節點能索引的範圍更大更精確,也意味著 b+樹單次磁碟io的資訊量大於b-樹,i/o效率更高。

mysql是一種關係型資料庫,區間訪問是常見的一種情況,b+樹葉節點增加的鏈指標,加強了區間訪問性,可使用在範圍區間查詢等,而b-樹每個節點 key 和 data 在一起,則無法區間查詢。

由 B B 樹分析 MySQL索引

b 樹有如下特點 b 樹是b 樹的變體,也是一種多路搜尋樹,它與 b 樹的不同之處在於 簡化 b 樹 如下圖 紅黑樹等資料結構也可以用來實現索引,但是檔案系統及資料庫系統普遍採用b tree作為索引結構。mysql 是基於磁碟的資料庫系統,索引往往以索引檔案的形式儲存的磁碟上,索引查詢過程中就要產生...

MySQL 索引演算法B B 樹原理 二

b tree是一種多路搜尋樹 並不是二叉的 1.定義任意非葉子結點最多只有m個兒子 且m 2 2.根結點的兒子數為 2,m 3.除根結點以外的非葉子結點的兒子數為 m 2,m 4.每個結點存放至少m 2 1 取上整 和至多m 1個關鍵字 至少2個關鍵字 5.非葉子結點的關鍵字個數 指向兒子的指標個數...

檔案 資料庫索引原理(B B 樹)

急於了解檔案 資料庫的索引原理,本文不具有真正的參考價值,只是從乙個懶人的角度速成原理。但是跳過了對b 和b 樹的嚴格定義。因短暫記憶,容易失憶,一星期之後再來回顧。現講結果 檔案 資料庫索引用的是b 樹 1.二叉查詢樹 左節點比根節點小,右節點比根節點大,原理是類似二分法,具體根據樹的子節點 對該...