InnoDB中的索引(二)—聯合索引與覆蓋索引

語言: CN / TW / HK

theme: channing-cyan

一起養成寫作習慣!這是我參與「掘金日新計劃 · 4 月更文挑戰」的第12天,點選檢視活動詳情

上篇文章講到了InnoDB中主要有B+樹索引,雜湊索引和全文索引,這篇文章主要介紹B+樹索引中的聯合索引和覆蓋索引

B+樹的索引

聯合索引

聯合索引是對錶中的多個列進行索引,如圖

36681ecc-fdfb-42fa-8715-947ea4cd5738.jpg

這裡涉及到一個最左字首匹配的問題,mysql會一直向右匹配直到遇到範圍查詢(>、<、between、like)就停止匹配。對於a=x and b = y and c = z這種等於號的查詢則可以任意順序(因為會優化)

由於聯合索引對第二個或第n個鍵值也是進行了排序的,因此有時使用聯合索引會省一次排序。

覆蓋索引

從輔助索引中就可以查詢到的記錄,不需要查詢聚簇索引中的記錄。比如說count(1).

這樣的好處是由於輔助索引的葉子節點所包含的資訊,遠小於聚簇索引,因此可以減少IO操作。

那麼什麼時候不選擇索引呢

其實優化器判斷是否需要索引,無非是基於一個成本,比如說 select * from table where key > 1000 這裡key是一個輔助索引,

那雖然我們可以通過輔助索引找到對應的書籤,但是實際上讀取的時候並不是順序讀取,而是離散讀取,這樣成本就變得不可控了,因此當訪問資料佔整體比重較大時(超過20%),就會使用聚簇索引作為key

當然可能會存在離散讀取和順序讀取差距並不是特別大的情況,比如使用了固態硬碟,這時我們可以使用關鍵字FORCE INDEX來強制使用某個索引。