天天看點

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

搞懂這個問題之前,我們首先來看一下MySQL表的存儲結構,再分别對比二叉樹、多叉樹、B樹和B+樹的差別就都懂了。

MySQL的存儲結構

表存儲結構

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

機關:表>段>區>頁>行

在資料庫中, 不論讀一行,還是讀多行,都是将這些行所在的頁進行加載。也就是說存儲空間的基本機關是頁。

一個頁就是一棵樹B+樹的節點,資料庫I/O操作的最小機關是頁,與資料庫相關的内容都會存儲在頁的結構裡。

B+樹索引結構

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

在一棵B+樹中,每個節點為都是一個頁,每次建立節點的時候,就會申請一個頁空間

同一層的節點為之間,通過頁的結構構成了一個雙向連結清單

非葉子節點為,包括了多個索引行,每個索引行裡存儲索引鍵和指向下一層頁面的指針

葉子節點為,存儲了關鍵字和行記錄,在節點内部(也就是頁結構的内部)記錄之間是一個單向的連結清單

B+樹頁節點結構

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

有以下幾個特點将所有的記錄分成幾個組, 每組會存儲多條記錄,

頁目錄存儲的是槽(slot),槽相當于分組記錄的索引,每個槽指針指向了不同組的最後一個記錄

我們通過槽定位到組,再檢視組中的記錄

頁的主要作用是存儲記錄,在頁中記錄以單連結清單的形式進行存儲。

單連結清單優點是插入、删除友善,缺點是檢索效率不高,最壞的情況要周遊連結清單所有的節點。是以頁目錄中提供了二分查找的方式,來提高記錄的檢索效率。

B+樹的檢索過程

我們再來看下B+樹的檢索過程從B+樹的根開始,逐層找到葉子節點。

找到葉子節點為對應的資料頁,将資料葉加載到記憶體中,通過頁目錄的槽采用二分查找的方式先找到一個粗略的記錄分組。

在分組中通過連結清單周遊的方式進行記錄的查找。

為什麼要用B+樹索引

資料庫通路資料要通過頁,一個頁就是一個B+樹節點,通路一個節點相當于一次I/O操作,是以越快能找到節點,查找性能越好。

B+樹的特點就是夠矮夠胖,能有效地減少通路節點次數進而提高性能。

下面,我們來對比一個二叉樹、多叉樹、B樹和B+樹。

二叉樹

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

二叉樹是一種二分查找樹,有很好的查找性能,相當于二分查找。

但是當N比較大的時候,樹的深度比較高。資料查詢的時間主要依賴于磁盤IO的次數,二叉樹深度越大,查找的次數越多,性能越差。

最壞的情況是退化成了連結清單,如下圖

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

為了讓二叉樹不至于退化成連結清單,人們發明了AVL樹(平衡二叉搜尋樹):任何結點的左子樹和右子樹高度最多相差1

多叉樹

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

多叉樹就是節點可以是M個,能有效地減少高度,高度變小後,節點變少I/O自然少,性能比二叉樹好了

B樹

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

B樹簡單地說就是多叉樹,每個葉子會存儲資料,和指向下一個節點的指針。

例如要查找9,步驟如下我們與根節點的關鍵字 (17,35)進行比較,9 小于 17 那麼得到指針 P1;

按照指針 P1 找到磁盤塊 2,關鍵字為(8,12),因為 9 在 8 和 12 之間,是以我們得到指針 P2;

按照指針 P2 找到磁盤塊 6,關鍵字為(9,10),然後我們找到了關鍵字 9。

B+樹

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

B+樹是B樹的改進,簡單地說是:隻有葉子節點才存資料,非葉子節點是存儲的指針;所有葉子節點構成一個有序連結清單

B+樹的内部節點并沒有指向關鍵字具體資訊的指針,是以其内部節點相對B樹更小,如果把所有同一内部節點的關鍵字存放在同一盤塊中,那麼盤塊所能容納的關鍵字數量也越多,一次性讀入記憶體的需要查找的關鍵字也就越多,相對IO讀寫次數就降低了

例如要查找關鍵字16,步驟如下與根節點的關鍵字 (1,18,35) 進行比較,16 在 1 和 18 之間,得到指針 P1(指向磁盤塊 2)

找到磁盤塊 2,關鍵字為(1,8,14),因為 16 大于 14,是以得到指針 P3(指向磁盤塊 7)

找到磁盤塊 7,關鍵字為(14,16,17),然後我們找到了關鍵字 16,是以可以找到關鍵字 16 所對應的資料。

B+樹與B樹的不同:B+樹非葉子節點不存在資料隻存索引,B樹非葉子節點存儲資料

B+樹查詢效率更高。B+樹使用雙向連結清單串連所有葉子節點,區間查詢效率更高(因為所有資料都在B+樹的葉子節點,掃描資料庫 隻需掃一遍葉子結點就行了),但是B樹則需要通過中序周遊才能完成查詢範圍的查找。

B+樹查詢效率更穩定。B+樹每次都必須查詢到葉子節點才能找到資料,而B樹查詢的資料可能不在葉子節點,也可能在,這樣就會造成查詢的效率的不穩定

B+樹的磁盤讀寫代價更小。B+樹的内部節點并沒有指向關鍵字具體資訊的指針,是以其内部節點相對B樹更小,通常B+樹矮更胖,高度小查詢産生的I/O更少。source:https://www.cnblogs.com/chenqionghe/p/14295404.html

為什麼mysql要用二叉樹_MySQL為什麼要使用B+樹索引

喜歡,在看