MySQL之 索引下推
1.開始
- 索引條件下推(Index Condition Pushdown),簡稱ICP。MySQL5.6新添加,用於優化數據的查詢。
- 當你不使用ICP,通過使用非主鍵索引(普通索引or二級索引)進行查詢,存儲引擎通過索引檢索數據,然后返回給MySQL服務器,服務器再判斷是否符合條件。
- 使用ICP,當存在索引的列做為判斷條件時,MySQL服務器將這一部分判斷條件傳遞給存儲引擎,然后存儲引擎通過判斷索引是否符合MySQL服務器傳遞的條件,只有當索引符合條件時才會將數據檢索出來返回給MySQL服務器。
- 官方文檔
2.適用場景
- 當需要整表掃描,e.g.:range,ref,eq_ref....
- 適用InnoDB引擎和MyISAM引擎查詢(5.6版本不適用分區查詢,5.7版本可以用於分區表查詢)。
- InnoDB引擎僅僅適用二級索引。(原因InnoDB聚簇索引將整行數據讀到InnoDB緩沖區)。
- 子查詢條件不能下推。觸發條件不能下推,調用存儲過程條件不能下推。
3.小示例
-
當我們創建一個用戶表(userinfo),其中有字段:id,name,age,addr。我們將name,age建立聯合索引。
當我們執行:select * from userinfo where name like "ming%" and age=20;
-
對於MySQL5.6之前:我們在索引內部首先通過name進行查找,在聯合索引name,age樹形查詢結果可能存在多個,然后再拿着id值去回表查詢,整個過程需要回表多次。
-
對於MySQL5.6之后:我們是在索引內部就判斷age是否等於20,對於不等於20跳過。因此在聯合索引name,age索引樹只匹配一個記錄,此時拿着這個id去主鍵索引樹種回表查詢全部數據,整個過程就回一次表。
-
如下:
當Extra值為:Using index condition.表示使用索引下推。
-
通過索引下推對於非主鍵索引進行優化,可有效減少回表次數,從而提高效率。
-
關閉索引下推命令
set optimizer_switch='index_condition_pushdown=off';