MySQL 索引與 B 樹

2022-08-17 06:45:17 字數 1997 閱讀 1035

mysql innodb 儲存引擎是使用 b+ 樹來組織索引的。在介紹 b+ 樹以前,先認識一下什麼是 b 樹,b 樹是平衡二叉樹,與一般的二叉查詢樹不同,平衡二叉樹首先滿足二叉查詢樹的定義(左子樹的鍵小於根的鍵,右子樹的鍵大於根的鍵),其次必須滿足任何節點的兩個子樹的高度最大差為 1。b 樹的維護要求插入和更新節點時,通過 1 次或多次左旋和右旋來滿足平衡的條件。二叉查詢樹是否平衡直接影響了查詢需要比較的次數。

b+ 樹與普通的二叉樹不同,它的節點由多個關鍵字和指向子樹的指標組成,指向子樹的指標個數等於關鍵字個數加 1,這些子樹中關鍵字的範圍由它的父節點限定,真正的資料部分是存放在葉子節點中的。mysql 中頁資料結構就是這些葉子節點,每個葉子節點對應了乙個 page,而 page 的資料結構中有 page_prev 和 page_next 兩個指標,因此這些葉子節點兩兩之間也是相互連線的。

由於 b+ 樹需要在插入後依然保證平衡,因此插入操作會涉及到頁的拆分操作。index page 指的是非葉子結點而 leaf page 指的是葉子節點。插入操作分為以下三種情況:

當 index page 和 leaf page 都不滿時,直接將記錄插入到葉子節點中。

當 index page 不滿,leaf page 滿時,先將節點放入對應 page,以中間節點作為依據,將 page 拆分,然後將中間節點放入 index page 中,拆分後的左右記錄分別放在中間節點的左右兩邊。

當 index page 和 leaf page 都滿了,先拆分 leaf page,然後再拆分 index page,拆分 index page 的方法與拆分 leaf page 的方法一樣。

此處需要注意:為了在可能地情況下減少頁的拆分操作,b+ 樹提供了類似二叉平衡樹的旋轉操作。旋轉操作發生在 leaf page 已經滿,但是其左右兄弟節點沒有滿的情況下。

b+ 樹使用填充因子來控制樹的變化,即中間節點關鍵字的數量和葉子節點關鍵字的數量和最大值的比例關係。此處以填充因子為 50% 為例。小於填充因子即為小於總容量的一半。刪除操作可以分為以下三種情況:

當 leaf page 關鍵字個數和 index page 節點關鍵字的個數都不小於填充因子時,直接將記錄從 leaf node 中刪除,如果該節點為 index page 節點,那麼將 index page 節點替換為其右節點。

當 leaf page 關鍵字個數小於而 index page 不小於填充因子時,將 leaf page 節點和其兄弟節點合併,同時更新 index page 節點。

當 leaf page 關鍵字個數和 index page 節點關鍵字的個數都小於填充因子時,在情況 2 的基礎上還需要合併 index page 節點。

索引在 mysql 中就是使用 b+ 樹實現的,不同索引之間形成的 b+ 樹也是不同的。

聚集索引

聚集索引就是根據主鍵來構造 b+ 樹,葉子節點存放對應頁的行記錄。

輔助索引(非聚集索引)

輔助索引就是使用非主鍵構造的 b+ 樹,葉子節點存放的是對應的鍵值以及相應的聚集索引鍵。通過輔助索引來搜尋一般是兩級的,第一級找到鍵值對應的聚集索引鍵,第二級是根據聚集索引鍵尋找行記錄。

聯合索引

聯合索引就是對錶上的多個列進行索引,這樣構造的 b+ 樹的 index node 和 page node 包含多個鍵。

索引覆蓋

在聯合索引的情況去搜尋行記錄,假設需要的行記錄的列正好包含在聯合索引中,那麼此時結果將可以直接從聯合索引中得到,省去了從聚集索引中搜尋,由於不包含整行的記錄所以可以大大減少 io。

不使用索引的情況

當查詢滿足條件的行的所有列時,mysql 不使用輔助索引,而是直接使用聚集索引。原因是即使使用了輔助索引,還是必須通過葉子節點中的目錄進行聚集索引的查詢,才能得到完整的資訊,那麼直接從聚集索引中獲取即可。

MySQL索引之B 樹與B 樹

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

B樹與B 樹索引

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

Mysql 索引(B樹或B 樹)

參考1 參考2myisam索引與innodb索引相比較 myisam支援全文索引 fulltext 壓縮索引,innodb不支援 innodb支援事務,myisam不支援 myisam順序儲存資料,索引葉子節點儲存對應資料行位址,輔助索引很主鍵索引相差無幾 innodb主鍵節點同時儲存資料行,其他輔...