1 什么是覆蓋索引?對要查詢的列 和 查詢條件中的列 有什么要求
覆蓋索引(Covering Index)是指一個索引包含了一次查詢所需的全部列,因此可以完全滿足查詢需求,而無需訪問實際的表行數據。(即避免回表操作)。
覆蓋索引的定義
覆蓋索引是一個包含查詢中的所有列(包括查詢條件列、選擇列和排序列)的索引。覆蓋索引使得查詢可以完全通過索引來執行,而不需要讀取表的實際數據行。
覆蓋索引的要求
- 查詢條件列(WHERE 子句中的列):這些列可以幫助MySQL快速定位匹配的行。
- 選擇列(SELECT 子句中的列):這些列是查詢返回的列。
- 排序列(ORDER BY 子句中的列):如果查詢包括排序,這些列應該包含在索引中,以利用索引進行排序。
舉個例子
假設有一個表?students
,包含以下字段:
id
(主鍵)name
age
grade
假設我們有以下查詢:
SELECT name, age FROM students WHERE name LIKE '張%' AND age > 20;
為了使查詢可以使用覆蓋索引,我們需要創建一個包含?name
?和?age
?列的復合索引:
CREATE INDEX idx_name_age ON students (name, age);
覆蓋索引的好處
- 提高查詢性能:由于所有查詢需要的數據都在索引中,MySQL不需要回表查找,減少了I/O操作。
- 減少數據頁訪問:訪問索引通常比訪問數據頁更快,特別是在表較大的情況下。
- 優化磁盤使用:使用覆蓋索引可以減少磁盤讀取操作,提高緩存命中率。
有了覆蓋索引?idx_name_age
?后,查詢過程如下:
- 索引掃描:MySQL使用?
idx_name_age
?索引找到所有?name LIKE '張%'
?的記錄。 - 索引下推(ICP):在索引掃描過程中,直接在索引中檢查?
age > 20
?的條件。 - 返回結果:由于?
name
?和?age
?都包含在索引中,MySQL可以直接從索引返回結果,而不需要訪問實際表數據。
總結
覆蓋索引通過包含查詢所需的所有列,顯著提高了查詢性能,尤其是對大表的查詢。為了充分利用覆蓋索引,建議在設計索引時,綜合考慮查詢條件列、選擇列和排序列,并在一個索引中包含這些列。