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

2021-07-29 22:16:05 字數 3059 閱讀 8139

b-tree是一種多路搜尋樹(並不是二叉的):

1.定義任意非葉子結點最多只有m個兒子;且m>2;

2.根結點的兒子數為[2, m];

3.除根結點以外的非葉子結點的兒子數為[m/2, m];

4.每個結點存放至少m/2-1(取上整)和至多m-1個關鍵字;(至少2個關鍵字)

5.非葉子結點的關鍵字個數=指向兒子的指標個數-1;

6.非葉子結點的關鍵字:k[1], k[2], …, k[m-1];且k[i] < k[i+1];

7.非葉子結點的指標:p[1], p[2], …, p[m];其中p[1]指向關鍵字小於k[1]的子樹,p[m]指向關鍵字大於k[m-1]的子樹,其它p[i]指向關鍵字屬於(k[i-1], k[i])的子樹;

8.所有葉子結點位於同一層;

如:(m=3)

b-樹的特性:

1.關鍵字集合分布在整顆樹中;

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

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

4.其搜尋效能等價於在關鍵字全集內做一次二分查詢;

5.自動層次控制;

b-樹的搜尋,從根結點開始,對結點內的關鍵字(有序)序列進行二分查詢,如果命中則結束,否則進入查詢關鍵字所屬範圍的兒子結點;重複,直到所對應的兒子指標為空,或已經是葉子結點;

b+樹是

b-樹的變體,也是一種多路搜尋樹: 1.

其定義基本與

b-樹同,除了: 2.

非葉子結點的子樹指標與關鍵字個數相同; 3.

非葉子結點的子樹指標

p[i]

,指向關鍵字值屬於

[k[i], k[i+1])

的子樹(

b-樹是開區間); 5.

為所有葉子結點增加乙個鏈指標; 6.

所有關鍵字都在葉子結點出現;

如:(m=3)

的搜尋與

b-樹也基本相同,區別是

b+樹只有達到葉子結點才命中(

b-樹可以在非葉子結點命中),其效能也等價於在關鍵字全集做一次二分查詢; b+

的特性: 1.

所有關鍵字都出現在葉子結點的鍊錶中(稠密索引),且鍊錶中的關鍵字恰好是有序的; 2.

不可能在非葉子結點命中; 3.

非葉子結點相當於是葉子結點的索引(稀疏索引),葉子結點相當於是儲存(關鍵字)資料的資料層; 4.

更適合檔案索引系統;

mysql中普遍使用b+tree做索引,但在實現上又根據聚簇索引和非聚簇索引而不同。

所謂聚簇索引,就是指主索引檔案和資料檔案為同一份檔案,聚簇索引主要用在innodb儲存引擎中。在該索引實現方式中

b+tree的葉子節點上的data就是資料本身,key為主鍵,如果是一般索引的話,data便會指向對應的主索引,如下圖所示:

在b+tree的每個葉子節點增加乙個指向相鄰葉子節點的指標,就形成了帶有順序訪問指標的b+tree。做這個優化的目的是為了提高區間訪問的效能,例如圖4中如果要查詢key為從18到49的所有資料記錄,當找到18後,只需順著節點和指標順序遍歷就可以一次性訪問到所有資料節點,極大提到了區間查詢效率。 非

聚簇索引就是指b+tree的葉子節點上的data,並不是資料本身,而是資料存放的位址。主索引和輔助索引沒啥區別,只是主索引中的key一定得是唯一的。主要用在myisam儲存引擎中,如下圖:

非聚簇索引比聚簇索引多了一次讀取資料的io操作,所以查詢效能上會差。

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟i/o消耗,相對於記憶體訪問,i/o訪問的消耗要高幾個數量級,所以評價乙個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟i/o操作次數的漸進複雜度。換句話說,索引的結構組織要儘量減少查詢過程中磁碟i/o的訪問次數。

簡單點說說記憶體讀取,記憶體是由一系列的儲存單元組成的,每個儲存單元儲存固定大小的資料,且有乙個唯一位址。當需要讀記憶體時,將位址訊號放到位址匯流排上傳給記憶體,記憶體解析訊號並定位到儲存單元,然後把該儲存單元上的資料放到資料匯流排上,回傳。

寫記憶體時,系統將要寫入的資料和單元位址分別放到資料匯流排和位址匯流排上,記憶體讀取兩個匯流排的內容,做相應的寫操作。

記憶體訪問效率,跟次數有關,先讀取a資料還是後讀取a資料不會影響訪問效率。而磁碟訪問就不一樣了,磁碟i/o涉及機械操作。磁碟是由大小相同且同軸的圓形碟片組成,磁碟可以轉動(各個磁碟須同時轉動)。磁碟的一側有磁頭支架,磁頭支架固定了一組磁頭,每個磁頭負責訪問乙個磁碟的內容。磁頭不動,磁碟轉動,但磁臂可以前後動,用於讀取不同磁軌上的資料。磁軌就是以碟片為中心劃分出來的一系列同心環(如圖示紅那圈)。磁軌又劃分為乙個個小段,叫扇區,是磁碟的最小儲存單元。

磁碟讀取時,系統將資料邏輯位址傳給磁碟,磁碟的控制電路會解析出實體地址,即哪個磁軌哪個扇區。於是磁頭需要前後移動到對應的磁軌,消耗的時間叫尋道時間,然後磁碟旋轉將對應的扇區轉到磁頭下,消耗的時間叫旋轉時間。所以,適當的操作順序和資料存放可以減少尋道時間和旋轉時間。

為了儘量減少i/o操作,磁碟讀取每次都會預讀,大小通常為頁的整數倍。即使只需要讀取乙個位元組,磁碟也會讀取一頁的資料(通常為4k)放入記憶體,記憶體與磁碟以頁為單位交換資料。因為區域性性原理認為,通常乙個資料被用到,其附近的資料也會立馬被用到。

b-tree:如果一次檢索需要訪問4個節點,資料庫系統設計者利用磁碟預讀原理,把節點的大小設計為乙個頁,那讀取乙個節點只需要一次i/o操作,完成這次檢索操作,最多需要3次i/o(根節點常駐記憶體)。資料記錄越小,每個節點存放的資料就越多,樹的高度也就越小,i/o操作就少了,檢索效率也就上去了。

b+tree:非葉子節點只存key,大大滴減少了非葉子節點的大小,那麼每個節點就可以存放更多的記錄,樹更矮了,i/o操作更少了。所以b+tree擁有更好的效能。

由 B B 樹分析 MySQL索引

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

由 B B 樹看 MySQL索引結構

b 樹有如下特點 所有鍵值分布在整顆樹中 任何乙個關鍵字出現且只出現在乙個結點中 搜尋有可能在非葉子結點結束 在關鍵字全集內做一次查詢,效能逼近二分查詢 b 樹是b 樹的變體,也是一種多路搜尋樹,它與 b 樹的不同之處在於 所有關鍵字儲存在葉子節點出現,內部節點 非葉子節點並不儲存真正的 data ...

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

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