B Tree,B Tree以及mysql索引的實現

2021-10-10 06:36:57 字數 1849 閱讀 6422

版權

通過這篇部落格來學習的:

一、b-tree

b-tree結構的1資料可以讓系統高效的找到資料所在的磁碟塊

為了描述b-tree,我們先定義一條資料記錄為乙個二元組[key,data],key為記錄的鍵值,對於不同資料記錄,key是互不相同的,data為key對應的值,m階的b-tree是滿足下列條件的資料結構

1.每個節點最多擁有m個子樹

2.根節點至少有兩個子樹

3.分支節點至少擁有m/2顆子樹(除根節點和葉子節點外的都是分支節點)

4.所有葉子節點都在同一層,每個節點最多可以有m-1個key,並且以公升序排列

以根節點為例,關鍵字為 17 和 35,p1 指標指向的子樹的資料範圍為小於 17,p2 指標指向的子樹的資料範圍為 17~35,p3 指標指向的子樹的資料範圍為大於 35。模擬查詢關鍵字 29 的過程:

根據根節點找到磁碟塊 1,讀入記憶體。【磁碟 i/o 操作第 1 次】

比較關鍵字 29 在區間(17,35),找到磁碟塊 1 的指標 p2。

根據 p2 指標找到磁碟塊 3,讀入記憶體。【磁碟 i/o 操作第 2 次】

比較關鍵字 29 在區間(26,30),找到磁碟塊 3 的指標 p2。

根據 p2 指標找到磁碟塊 8,讀入記憶體。【磁碟 i/o 操作第 3 次】

在磁碟塊 8 中的關鍵字列表中找到關鍵字 29。

b-tree存在的問題:

(1)每個節點中有key,也有data,而每乙個頁的儲存空間是有限的,如果data資料較大時就會導致每個節點(即乙個頁)能儲存的key的數量很小

(2)當儲存的資料量很大時,同樣1會導致b-tree的深度較大,增加查詢時的磁碟i/o次數,進而影響查詢效率

二、b+tree

b+tree是在b-tree基礎上的一種優化,innodb儲存引擎就是用b+tree實現其索引結構的

b+tree中,所有資料記錄節點都是按照鍵值大小順序存放在同一層的葉子節點上,而非葉子節點上只儲存key值資訊,這樣可以大大加大每個節點儲存的key值數量,降低b+tree的高度,變化點:

(1)資料是存在葉子節點中的

(2)資料節點之間是有指標指向的

通常在b+tree上有兩個頭指標,乙個指向根節點,另乙個指向關鍵字最小的葉子結點,而且所有葉子節點(即資料節點之間是一種鏈式環結構),因此可以對b+tree進行兩種查詢運算

(1)對於主鍵的範圍查詢和分頁查詢

(2)從根節點開始,進行隨機查詢

關於mysql的資料引擎

innodb和myisam的索引的底層實現都是通過b+tree來實現的

1、innodb中的b+tree

innodb是通過b+tree結構對id建索引,然後在葉子節點中儲存記錄,採用innodb引擎的資料儲存檔案有兩個,乙個定義檔案,乙個資料檔案。若建索引的字段不是主鍵id,則對該字段建索引,然後在葉子節點中儲存的是該記錄的主鍵,然後通過主鍵索引來找到對應的記錄

2、myisam中索引和資料分別存放在不同的檔案,所以在索引樹中的葉子節點中存放的資料是該索引對應的資料記錄的位址,由於資料與索引不在一起,所以myisam是非聚簇索引

分類: mysql

為什麼使用B Tree(B Tree)

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

b tree b tree 2 3 4樹個人總結

是時候了解了解演算法了 b tree b tree 1.b tree非葉子節點包含關鍵字資訊,b tree不包含關鍵字資訊,僅儲存關鍵字範圍,所以b tree的樹高度可能相對更低,能減少磁碟io 2.b tree所有的資訊存在葉子節點中 3.m階的b tree的孩子個數為ceil 2 m 1 n m...

(五)平衡多路查詢樹(B Tree B Tree)

b tree就是我們常說的b樹,常常用於實現資料庫索引,因為它的查詢效率比較高 前面提到的2 3樹可以看作b樹的一種例項 二叉查詢樹的時間複雜度是o logn 查詢次數和比較次數較少,但是對於磁碟的io次數,最壞情況下磁碟的io次數由樹的高度決定,所以減少磁碟io次數就必須壓縮樹的高度,讓瘦高的樹盡...