MySQL:你知道什麼是覆蓋索引嗎?

什麼叫做覆蓋索引?

  • 解釋一: 就是select的數據列只用從索引中就能夠取得,不必從數據表中讀取,換句話說查詢列要被所使用的索引覆蓋。
  • 解釋二: 索引是高效找到行的一個方法,當能通過檢索索引就可以讀取想要的數據,那就不需要再到數據表中讀取行了。如果一個索引包含了(或覆蓋了)滿足查詢語句中字段與條件的數據就叫做覆蓋索引。
  • 解釋三:是非聚集組合索引的一種形式,它包括在查詢裡的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆蓋查詢語句[select子句]與查詢條件[Where子句]中所涉及的字段,也即,索引包含了查詢正在查找的所有數據)。

不是所有類型的索引都可以成為覆蓋索引。覆蓋索引必須要存儲索引的列,而哈希索引、空間索引和全文索引等都不存儲索引列的值,所以MySQL只能使用B-Tree索引做覆蓋索引
當發起一個被索引覆蓋的查詢(也叫作索引覆蓋查詢)時,在EXPLAIN的Extra列可以看到“Using index”的信息。

注:遇到以下情況,執行計劃不會選擇覆蓋查詢。

  1. select選擇的字段中含有不在 索引 中的字段 ,即索引沒有覆蓋全部的列。
  2. where條件中不能含有對索引進行like的操作。

mysql聚集索引,輔助索引,聯合索引,覆蓋索引

聚集索引:
一個表中只能有一個,聚集索引的順序與數據真實的物理存儲順序一致。查詢速度賊快,聚集索引的葉子節點上是該行的所有數據 ,數據索引能加快範圍查詢(聚集索引的順序和數據存放的邏輯順序一致)。主鍵!=聚集索引。

輔助索引(非聚集索引):
一個表中可以有多個,葉子節點存放的不是一整行數據,而是鍵值,葉子節點的索引行中還包含了一個'書籤',這個書籤就是指向聚簇索引的一個指針,從而在聚簇索引樹中找到一整行數據。

聯合索引:
就是由多列組成的的索引。遵循最左前綴規則。對where,order by,group by 都生效。

覆蓋索引:
指從輔助索引中就能獲取到需要的記錄,而不需要查找聚簇索引中的記錄。使用覆蓋索引的一個好處是因為輔助索引不包括一條記錄的整行信息,所以數據量較聚集索引要少,可以減少大量io操作。

聚集索引與輔助索引的區別:
葉子節點是否存放的為一整行數據

最左前綴規則:
假設聯合索引由列(a,b,c)組成,則一下順序滿足最左前綴規則:a、ab、abc;selece、where、order by 、group by都可以匹配最左前綴。其它情況都不滿足最左前綴規則就不會用到聯合索引。

MySQL:你知道什麼是覆蓋索引嗎?


分享到:


相關文章: