覆蓋索引又可以稱為索引覆蓋。
解釋一: 就是select的數據列只用從索引中就能夠取得,不必從數據表中讀取,換句話說查詢列要被所使用的索引覆蓋。
解釋二: 索引是高效找到行的一個方法,當能通過檢索索引就可以讀取想要的數據,那就不需要再到數據表中讀取行了。如果一個索引包含了(或覆蓋了)滿足查詢語句中字段與條件的數據就叫做覆蓋索引。
解釋三: 是非聚集組合索引的一種形式,它包括在查詢里的Select、Join和Where子句用到的所有列(即建立索引的字段正好是覆蓋查詢語句[select子句]與查詢條件[Where子句]中所涉及的字段,也即,索引包含了查詢正在查找的所有數據)。
首先,從聚集索引說起,聚集索引實際上就是一個覆蓋索引,在大多數情況下,可以很直觀地分辨出數據表的當前聚集索引是否有用,因為聚集索引根據鍵值字段控制了數據行的順序。由於SQL SERVER以聚集索引的鍵值字段來排序數據行,所以當你經常需要對某些字段排序時,把這些要排序的字段作為聚集索引的鍵值,創建聚集索引將對查詢性能會有很大的提升。因為數據已經照聚集索引的鍵值字段的順序排序,所以查詢執行時不需要額外的排序操作。同時如果使用聚集索引來查找同條記錄的其他字段的數據,SQL SERVER也不需要額外地通過指針檢索數據,因為在聚集索引找到索引鍵值的同時就已經找到整條數據。
聚集索引在檢索符合某個范圍的數據時也很有用。例如,你想要找到所有銷售訂單編號介於18000-19999的訂單,而聚集索引就是通過銷售訂單編號字段建立的,相近的記錄全部會擺放在一起,則訪問的分頁當然就比較少,通過聚集索引可快速定位包含起始銷售訂單編號的行,然后檢索表中所有連續的行,直到檢索到最后的銷售訂單號。
聚集索引在檢索占總行數比例很大的數據行時也比較有用。
下圖是使用聚集索引查找數據的示意圖。
使用聚集索引的好處在於:
1)所需要的數據都在子葉層(即數據頁),找到正確的索引鍵值后不需要再利用指針做額外的查找
2)SQL SERVER將符合相同條件的數據集中放在一起
其次,非聚集索引。非聚集索引結構如下圖。
如果想要使建立的非聚集索引同時具備以上兩種好處,那就要建立非聚集覆蓋索引。通過覆蓋索引,所有查詢想要的數據字段都是索引鍵值的一部分,而存放在索引的子葉層級。覆蓋索引不僅僅只包含你寫在WHERE條件內的字段,而且還包含所有SELECT 需要的字段,以及在GROUP BY 或ORDER BY 子句內的字段。