覆蓋索引

覆蓋索引是select的數據列只用從索引中就能夠取得,不必讀取數據行,換句話說查詢列要被所建的索引覆蓋。

基本介紹

  • 中文名:覆蓋索引
  • 別名:索引覆蓋
  • 使用:建立一個多列索引
  • 性質:計算機
概念,作用,

概念

理解方式一:索引是高效找到行的一個方法,但是一般資料庫也能使用索引找到一個列的數據,因此它不必讀取整個行。畢竟索引葉子節點存儲了它們索引的數據;當能通過讀取索引就可以得到想要的數據,那就不需要讀取行了。一個索引包含了(或覆蓋了)滿足查詢結果的數據就叫做覆蓋索引。
理解方式二:是非聚集複合索引的一種形式,它包括在查詢里的Select、Join和Where子句用到的所有列(即建索引的欄位正好是覆蓋查詢條件中所涉及的欄位,也即,索引包含了查詢正在查找的數據)。

作用

如果你想要通過索引覆蓋select多列,那么需要給需要的列建立一個多列索引,當然如果帶查詢條件,where條件要求滿足最左前綴原則。
Innodb的輔助索引葉子節點包含的是主鍵列,所以主鍵一定是被索引覆蓋的。
(1)例如,在sakila的inventory表中,有一個組合索引(store_id,film_id),對於只需要訪問這兩列的查 詢,MySQL就可以使用索引,如下:
mysql> EXPLAIN SELECT store_id, film_id FROM sakila.inventory
(2)再比如說在文章系統里分頁顯示的時候,一般的查詢是這樣的:
SELECT id, title, content FROM article ORDER BY created DESC LIMIT 10000, 10;
通常這樣的查詢會把索引建在created欄位(其中id是主鍵),不過當LIMIT偏移很大時,查詢效率仍然很低,改變一下查詢:
SELECT id, title, content FROM article
INNER JOIN (
SELECT id FROM article ORDER BY created DESC LIMIT 10000, 10
) AS page USING(id)
此時,建立複合索引"created, id"(只要建立created索引就可以吧,Innodb是會在輔助索引裡面存儲主鍵值的),就可以在子查詢里利用上Covering Index,快速定位id,查詢效率嗷嗷的。

相關詞條

熱門詞條

聯絡我們