聯合索引(複合索引)在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+樹 是根據最左邊的欄位構建的,我的想法是這樣子的。
如果不對,一定要幫忙批評指正啊。