MySQL聯合索引在B+樹如何存儲以及尋址

引入

最近找工作, 去一家三方支付公司面試,前面得過程還挺好,所有的提都回答對了(心裏暗自竊喜應該能拿到高工資offer,迎娶白富美,然後走向人生巔峯),面試官說問最後一個問題:“聯合索引在B+樹如何存儲以及如何尋址?”,然後一臉懵逼【我只記得索引前綴匹配原則~~】。然後,,就沒有然後了。。直接讓回家。
回來看資料博客,以及和同事討論。稍微有點眉目。

Innodb B+樹

先看一下B+樹。這裏直接拿張洋大神的圖 鏈接:http://blog.codinglabs.org/articles/theory-of-mysql-index.html。

聚簇索引:
在這裏插入圖片描述

輔助非聚簇索引:
在這裏插入圖片描述
結構:當一個表T(id,name,age,sex,high)建一個普通索引 KEY(name),name的索引結果就和上面輔助非聚簇索引結構一樣。
查詢:當有一個select id,name,age from T where name = “” 輔助索引會根據name在B+樹上進行二叉樹查找,找出葉子節點數據後發現沒有age這個數據,就會進行回表操作到主鍵聚簇索引去查找,拿到聚簇索引葉子節點的age數據。

聯合索引存儲以及尋址

索引結構:因爲上述回表操作也會消耗性能,所以系統可以根據業務情況加上一個組合索引(並不是一定得加,畢竟索引也是個珍貴的資源),例如給上述加上一個組合索引 KEY(name,age,sex)【 KEY(col1,col2,col3)】。那麼這個組合索引的B+樹非葉子節點數據結構和上述輔助非聚簇索引圖一樣,但是葉子節點是這樣的
在這裏插入圖片描述
葉子節點存儲col1,col2,col3這三列數據以及加上ID這一列數據。
尋址過程:
例如語句:select id,name,age from T where name = “張三” and age=25,先根據name字段從輔助聚簇索引定位到哪一個葉子節點數據中,然後根據age節點在上述表格的前6行中,尋找age= 25的數據,然後找出所有符合的數據以及其對應的ID,然後根據ID來進行回表操作查詢。這裏返回了三條數據,就回了三次表。

總結

對一個知識點要深入理解才行,不能光看表面,死記更背。重要還是去自己思索,纔會是自己的東西。

上述寫的有問題麻煩大佬指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章