索引的底層實現(B 樹)

2022-03-30 19:50:12 字數 2644 閱讀 5739

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

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.所有葉子結點位於同一層;

b-樹的特性:

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

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

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

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

5.自動層次控制;

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

1.其定義基本與b-樹同,除了:

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

3.非葉子結點的子樹指標p[i],指向關鍵字值屬於[k[i], k[i+1])的子樹(b-樹是開區間);

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

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

b+的特性:

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

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

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

4.更適合檔案索引系統;

這都是由於b+樹和b具有這不同的儲存結構所造成的區別,以乙個m階樹為例。

關鍵字的數量不同;b+樹中分支結點有m個關鍵字,其葉子結點也有m個,其關鍵字只是起到了乙個索引的作用,但是b樹雖然也有m個子結點,但是其只擁有m-1個關鍵字。

儲存的位置不同;b+樹中的資料都儲存在葉子結點上,也就是其所有葉子結點的資料組合起來就是完整的資料,但是b樹的資料儲存在每乙個結點中,並不僅僅儲存在葉子結點上。

分支結點的構造不同;b+樹的分支結點僅僅儲存著關鍵字資訊和兒子的指標(這裡的指標指的是磁碟塊的偏移量),也就是說內部結點僅僅包含著索引資訊。

查詢不同;b樹在找到具體的數值以後,則結束,而b+樹則需要通過索引找到葉子結點中的資料才結束,也就是說b+樹的搜尋過程中走了一條從根結點到葉子結點的路徑

myisam 引擎使用 b+tree 作為索引結構,葉節點的 data 域存放的是資料記錄

的位址。

主索引與輔助索引的區別(對某列建立索引):

在結構上沒有任何區別,只是主索引要求 key 是唯一的,而輔助索引的 key 可以重複

主索引(聚集索引)也就是表的主鍵,是建表時指定的,並且是唯一的

輔助索引(非聚集索引)是對錶有其他需要可以新增建立的

下圖是 myisam 索引的原理圖:

索引過程:

myisam 中索引檢索的演算法為首先按照 b+tree 搜尋演算法搜尋索引,如果指定的 key 存在,則取出其data 域的值,然後以 data 域的值為位址,讀取相應資料記錄。

1、innodb 的資料檔案本身就是索引檔案。從上文知道,myisam 索引檔案和資料檔案是分離的,索引檔案僅儲存資料記錄的位址。

而在innodb 中,表資料檔案本身就是按 b+tree 組織的乙個索引結構,這棵樹的葉點data 域儲存了完整的資料記錄。這個索引的 key 是資料表的主鍵,因此 innodb 表資料檔案本身就是主索引。

innodb 要求表必須有主鍵(myisam 可以沒有),如果沒有顯式指定,則 mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則mysql 自動為 innodb 表生成乙個隱含字段作為主鍵,型別為長整形

2、第二個與 myisam 索引的不同是 innodb 的輔助索引 data 域儲存相應記錄主鍵的值而不是位址。換句話說,innodb 的所有輔助索引都引用主鍵作為 data 域。

輔助索引搜尋需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。

3、主鍵過長導致:

因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。

MySQL innodb 索引 B 樹實現

首先說說mysql裡面索引的型別 從資料結構角度 1 b 樹索引 o log n 2 hash索引 a 僅僅能滿足 in 和 查詢,不能使用範圍查詢 b 其檢索效率非常高,索引的檢索可以一次定位,不像b tree 索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以 hash 索引...

索引之B樹 B 樹 B 樹 B 樹

原文索引之b樹 b 樹 b 樹 b 樹 b 樹即二叉搜尋樹 1.所有非葉子結點至多擁有兩個兒子 left 和right 2.所有結點儲存乙個關鍵字 3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹 如 b樹的搜尋,從根結點開始,如果查詢的關鍵字與結點的關鍵字相等,那麼就命中...

B樹與B 樹索引

b 樹 資料庫結構使用樹的結構索引,從演算法邏輯上看,二叉查詢樹的查詢速度和比較次數都是最小的。資料庫的索引儲存在磁碟上,當資料量比較大的時候,索引的大小可能有幾個g 甚至更多。當我們利用索引查詢的時候,不可能把整個索引載入到記憶體,能做的只有逐一載入每乙個磁碟頁,磁碟頁對應索引樹的節點。當利用二叉...