MySQL索引原理分析(為什麼使用B 樹)

2021-09-12 11:01:13 字數 2142 閱讀 5779

1、雜湊表有什麼特點?

假如有這麼一張表(表名:sanguo):

現在對name欄位建立雜湊索引:

注意字段值所對應的陣列下標是雜湊演算法隨機算出來的,所以可能出現雜湊衝突。那麼對於這樣乙個索引結構,現在來執行下面的sql語句:

select * from sanguo where name='周瑜';
可以直接對『周瑜』按雜湊演算法算出來乙個陣列下標,然後可以直接從資料中取出資料並拿到鎖對應那一行資料的位址,進而查詢那一行資料。此時查詢效率還是蠻高的。

那麼如果現在執行下面的sql語句:

select * from sanguo where name>『周瑜』;

則無能為力,因為雜湊表的特點就是可以快速的精確查詢,但是不支援範圍查詢

2、如果用完全平衡二叉樹呢?

還是上面的表資料用完全平衡二叉樹表示如下圖(為了簡單,資料對應的位址就不畫在圖中了。):

圖中的每乙個節點實際上應該有四部分:

左指標,指向左子樹

鍵值鍵值所對應的資料的儲存位址

右指標,指向右子樹

另外需要提醒的是,二叉樹是有順序的,簡單的說就是「左邊的小於右邊的」假如我們現在來查詢『周瑜』,需要找2次(第一次曹操,第二次周瑜),比雜湊表要多一次。而且由於完全平衡二叉樹是有序的,所以也是支援範圍查詢的。

3、如果用完全平衡二叉樹呢?

還是上面的表資料用b樹表示如下圖(為了簡單,資料對應的位址就不畫在圖中了。)

可以發現同樣的元素,b樹的表示要比完全平衡二叉樹要「矮」,原因在於b樹中的乙個節點可以儲存多個元素。

4、如果用b+樹呢?

還是上面的表資料用b+樹表示如下圖(為了簡單,資料對應的位址就不畫在圖中了。):

我們可以發現同樣的元素,b+樹的表示要比b樹要「胖」,原因在於b+樹中的非葉子節點會冗餘乙份在葉子節點中,並且葉子節點之間用指標相連。

5、那麼b+樹到底有什麼優勢呢?

這裡我們用「反證法」,假如我們現在就用完全平衡二叉樹作為索引的資料結構,我們來看一下有什麼不妥的地方。實際上,索引也是很「大」的,因為索引也是儲存元素的,我們的乙個表的資料行數越多,那麼對應的索引檔案其實也是會很大的,實際上也是需要儲存在磁碟中的,而不能全部都放在記憶體中,所以我們在考慮選用哪種資料結構時,我們可以換乙個角度思考,哪個資料結構更適合從磁碟中讀取資料,或者哪個資料結構能夠提高磁碟的io效率。回頭看一下完全平衡二叉樹,當我們需要查詢「張飛」時,需要以下步驟

從磁碟中取出「曹操」到記憶體,cpu從記憶體取出資料進行筆記,「張飛」

從磁碟中取出「周瑜」到記憶體,cpu從記憶體取出資料進行筆記,「張飛」>「周瑜」,取右子樹(產生了一次磁碟io)

從磁碟中取出「孫權」到記憶體,cpu從記憶體取出資料進行筆記,「張飛」>「孫權」,取右子樹(產生了一次磁碟io)

從磁碟中取出「黃忠」到記憶體,cpu從記憶體取出資料進行筆記,「張飛」=「張飛」,找到結果(產生了一次磁碟io)

同理,回頭看一下b樹,我們發現只傳送三次磁碟io就可以找到「張飛」了,這就是b樹的優點:乙個節點可以儲存多個元素,相對於完全平衡二叉樹所以整棵樹的高度就降低了,磁碟io效率提高了。

而b+樹是b樹的公升級版,只是把非葉子節點冗餘一下,這麼做的好處是為了提高範圍查詢的效率。

到這裡可以總結出來,mysql選用b+樹這種資料結構作為索引,可以提高查詢索引時的磁碟io效率,並且可以提高範圍查詢的效率,並且b+樹里的元素也是有序的。

Mysql索引底層原理分析

mysql索引底層原理分析,mysql索引的本質 mysql索引的底層原理 mysql索引的實戰經驗 面試問 資料庫中最常見的慢查詢優化方式是什麼?同學a 加索引。問 為什麼加索引能優化慢查詢?同學a 不知道同學b 因為索引其實就是一種優化查詢的資料結構,比如mysql中的索引是用b 樹實現的,而b...

mysql 索引底層原理分析

一 區分幾個概念 1 頁 1 頁號 記錄當前是第幾頁。2 頁目錄 記錄行資料,標記行開始的最小主鍵索引資料。3 行資料 標識每一行的資料。1 111a 標識第一行資料,1 表示主鍵索引。行與行資料使用鍊錶有序相連。2 b 樹 多個頁相互連線在一起,為了方便查詢會再向上生成乙個新的類似頁的東西,記錄頁...

MySQL的索引結構原理分析

1.索引是什麼?索引是一種資料結構 索引是一種排好序的資料結構 2.索引的目的是什麼?幫助使用者高效快速查詢到業務所需的資料 綜上所訴,因此在大資料量的乙個表中,什麼樣的一種排好序的資料結構能夠達到我們的目的 1.特點 a 所有的葉子節點具有相同的深度,葉子節點的指標為空 b 所有的索引元素不重複 ...