1. 程式人生 > >聯合索引(複合索引)在B+樹上的結構

聯合索引(複合索引)在B+樹上的結構

這幾天看了B系列樹和資料庫索引相關的一些知識,看完這篇文章之後《MySQL索引背後的資料結構及演算法原理

收穫很大,瞭解了很多知識,隨後也產生了一個想法:聯合索引 對應的 B+ 樹 是一個什麼樣子的結構。帶著這個想法各種百度

也沒得到自己想要的答案,那我就把我的想法寫下來。

對於這塊知識,我也是剛入門,如果有大神看到我的想法不對,還請多多指正。

這裡以MySql INNODB為例,MyISAM道理是一樣的。然後先從原文搬幾個圖過來:


這是一張表格,col1 是主建,col2和col3 是普通欄位。那麼主索引 對應的 B+樹 結構是這樣子的:


也可以是這樣子的,這是我畫的:


現在呢,對col3 建立一個單列索引,原文圖:


看完這個圖也是可以理解的,那麼想法來了,如果對 col3 和 col2 建立 聯合索引,那麼 B+ 樹會是一個什麼樣子的呢?

首先可以肯定的是,肯定只有一棵樹,又因為 最左原則的存在,那麼帶著這個想法自己試著畫了下:


建索引語句 CREATE INDEX IDX_XXX ON TABLE(COL3, COL2);

先根據col3 排序,在根據 col2 排序,如上圖。

原文例子中的資料沒有重複資料,為了更好的理解,我自己改了下:


紅色框是改動的地方,把col3 改成有重複資料了,然後 還是對 col3 ,col2建立聯合索引,那麼 B+樹 如下:


紅色框是和原來不一樣的地方。

聯合索引在查詢的時候,比如要找 Alice,34 這條記錄 WHERE COL3 = 'Alice' AND COL2 = 34

先根據col3 查詢 Alice ,找到了2條記錄,在根據col2 查詢 34,然後獲取到主鍵 15 ,在根據主鍵去查詢 主索引。

如果 是 WHERE COL2 = 34,由於只有聯合索引 (col3, col2),沒有col2 的單列索引。

那麼查詢的時候,就沒法根據上面的這棵樹來查詢 ,只能全表掃描。

所以為什麼會有最左原則,就是因為 B+樹 是根據最左邊的欄位構建的,我的想法是這樣子的。

如果不對,一定要幫忙批評指正啊。