MySQL之 索引下推


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';
    
  • MySQL的server層和存儲引擎層是如何交互的

  • MySQL執行計划extra中的using index 和 using where using index 的區別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM