MySQL索引之B 樹索引

2021-06-27 11:16:56 字數 2509 閱讀 9127

b+樹索引是是目前關係型資料庫系統中查詢最為常用和最為有效的索引,b+樹的索引構造類似於二叉樹,根據鍵值(key value)快速找到資料。

1、什麼是b+樹?

首先,b+樹中的b並不是二叉樹(binary)的意思,這裡的b表示的是blance即平衡的意思。那麼b+樹其實就是平衡查詢樹。其滿足兩個條件:平衡樹和查詢樹。

關於平衡樹的定義我們可以再任何乙個資料結構書上找到,最常用的莫過於平衡二叉樹,其定義為滿足任何節點的兩個子樹的高度最大差為1.如下圖所示,左邊的為非平衡二叉樹,右邊的為平衡二叉樹。

對於查詢樹,大家應該都知道二分查詢,二分查詢平均查詢時間為o(n)=logn。之所以查詢如此之快是因為其中的資料已經得到排序。同理二叉查詢樹也是經過排序的查詢樹。其定義為任何乙個非葉子節點的左子樹的值不大於父節點的值,右子樹的值大於其父節點的值。

對於乙個已經排序的陣列,將其構造成二叉查詢樹的形式有很多種,但是效率最高的一種就是平衡二叉查詢樹。我們用的b+樹就是這樣的平衡查詢樹,只不過其為普通的樹而非二叉樹。

上圖為乙個深度為2的b+樹,其所有的記錄都是存放在最下層的葉子節點上的。而父節點只是提供了查詢該葉子節點的索引。如果我們需要查詢乙個記錄,根據b+樹可以很快地定位到該記錄:例如我們如果要查詢15,我們先通過第一層索引找到25,比較15與25,由於15小於25所以我們在25所指向的葉子節點區域查詢15,這樣就可以很快地定位到15這條記錄。

在mysql的innodb引擎中,b+樹索引就是按照上述方式儲存資料的。至於其插入和刪除操作,感興趣的可以參考這方面的專業書籍。

2、b+樹索引

b+樹索引的本質就是b+樹在資料庫中的實現。b+樹在資料庫中有乙個特點就是高扇出性,在資料庫中b+樹一般都在2-4層,因此查詢某一鍵值記錄時最多隻需要2-4次io。

在資料庫中b+樹索引可分為聚集索引(clustered index)和輔助索引(secondary index)。不管是輔助索引還是聚集索引,其在資料庫內部都是b+樹。聚集索引與輔助索引不同的是聚集索引在葉子節點存放著記錄一整行的資訊。

1、聚集索引:聚集索引就是按照每張表的主鍵構造一顆b+樹,同時葉子節點中存放著的即為整張表的行記錄資料。一般情況下,查詢優化器更傾向於採用聚集索引,因為其葉子節點中存放著整個表的記錄。由於每張表都只有乙個主鍵(無論是使用者指定還是資料庫自動建立的),所以每張表都會生成乙個b+數聚集索引,而且只有乙個。相反,我們可以為一張表指定多個輔助索引。

建立如下資料庫:

create table t (

a int not null,

b int,

c int,

primary key (a)

)engine=innodb;

在書庫庫t中我們指定主鍵為a,則資料庫會自動按照a的值構建b+樹索引。b+樹索引的乙個好處就是它對於主鍵的排序查詢和範圍查詢非常快。我們在表t中插入如下資料:

insert into t select 4,1,8;

insert into t select 5,4,7;

insert into t select 2,3,4;

insert into t select 8,4,9;

insert into t select 7,2,3;

insert into t select 1,3,3;

insert into t select 3,6,5;

insert into t select 10,8,6;

insert into t select 9,9,1;

insert into t select 6,7,2;

對其進行查詢和排序:

如圖所示:第一張是按照主鍵a進行排序,其基本在一瞬間就可以完成,第二張是按照b排序,則其花費時間比按照主鍵排序要多。

2、輔助索引:對於輔助索引,葉子節點並不包含行記錄的所有資料。葉子節點除了包含鍵值以外,每個葉子節點中的索引行中還包含了乙個書籤。該書籤用來告訴innodb儲存引擎**可以找到與索引相對應的行資料。由於innodb儲存引擎表是索引組織表,因此innodb儲存引擎的輔助索引的書籤就是相應行資料的聚集索引鍵。

上圖所示為輔助索引與聚集索引的關係,助索引的葉子節點中儲存的為聚集索引的鍵值,要想通過輔助索引獲得乙個完整的記錄,innodb引擎會遍歷輔助索引從而查到其對應葉子節點所指向聚集索引的主鍵,然後根據該主鍵通過聚集索引獲得乙個完整的記錄。

假設一張表中輔助索引的高度為3,聚集索引的高度也為3,則通過輔助索引獲得乙個行記錄的要經過6此查詢,其中前三次查詢在在輔助索引中找到對應的聚集索引中的鍵值,後三次是根據查詢得到的鍵值在聚集索引中找到完整行。

MySql索引之B 樹

使用何種資料結構作為索引底層實現的乙個重要衡量指標就是磁碟io的操作次數。對於資料庫而言,索引本身也很大,需要以索引檔案的形式儲存在磁碟上,因此磁碟io操作次數直接決定了索引的效能。b 樹能夠有效利用系統對磁碟的塊讀取特性,在讀取相同磁碟塊的同時,盡可能多的載入索引資料,來提高索引命中效率,從而達到...

Mysql之B樹索引

聚集索引 簡單概念 乙個表中根據主鍵建立的一棵b 樹,索引的葉子節點存放了表中所有的記錄,儲存記錄在物理位置上是連續的,乙個葉子節點存放一條對應的記錄 ps 是根據主鍵建立的b 樹,葉子節點存資料記錄 舉個例子 以漢語字典為例 漢語字典的正文本身就是乙個聚集索引,比如我們要查 安 字,由於漢語詞典的...

MySQL索引之B 樹與B 樹

本文只是個人閱讀筆記,原文建議詳細閱讀 什麼是b 樹 什麼是b 樹 我們知道mysql中索引最常用的資料結構就是hash和b tree,而其中的b 樹更是大多數 mysql 儲存引擎的預設索引型別。1 雜湊表 二叉查詢樹 b樹的比較要弄清楚b 樹,就得先知道b 樹 b 樹就是b樹 首先mysql索引...