mysql高效索引之覆蓋索引

什麼叫作覆蓋索引?mysql

解釋一: 就是select的數據列只用從索引中就可以取得,沒必要從數據表中讀取,換句話說查詢列要被所使用的索引覆蓋。sql

解釋二: 索引是高效找到行的一個方法,當能經過檢索索引就能夠讀取想要的數據,那就不須要再到數據表中讀取行了。若是一個索引包含了(或覆蓋了)知足查詢語句中字段與條件的數據就叫作覆蓋索引。指針

解釋三:是非彙集組合索引的一種形式,它包括在查詢裏的Select、Join和Where子句用到的全部列(即創建索引的字段正好是覆蓋查詢語句[select子句]與查詢條件[Where子句]中所涉及的字段,也即,索引包含了查詢正在查找的全部數據)。
 不是全部類型的索引均可以成爲覆蓋索引。覆蓋索引必需要存儲索引的列,而哈希索引、空間索引和全文索引等都不存儲索引列的值,因此MySQL只能使用B-Tree索引作覆蓋索引
當發起一個被索引覆蓋的查詢(也叫做索引覆蓋查詢)時,在EXPLAIN的Extra列能夠看到「Using index」的信息。索引

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

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

mysql彙集索引,輔助索引,聯合索引,覆蓋索引select

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

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

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

覆蓋索引:
指從輔助索引中就能獲取到須要的記錄,而不須要查找聚簇索引中的記錄。使用覆蓋索引的一個好處是由於輔助索引不包括一條記錄的整行信息,因此數據量較彙集索引要少,能夠減小大量io操做。index

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

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

相關文章
相關標籤/搜索