索引下推
概述
索引條件下推優化(Index Condition Pushdown (ICP) )是MySQL5.6添加的,用于優化數據查詢。?
- 不使用索引條件下推優化時存儲引擎通過索引檢索到數據,然后返回給MySQL服務器,服務器然后判斷數據是否符合條件。?
- 當使用索引條件下推優化時,如果存在某些被索引的列的判斷條件時,MySQL服務器將這一部分判斷條件傳遞給存儲引擎,然后由存儲引擎通過判斷索引是否符合MySQL服務器傳遞的條件,只有當索引符合條件時才會將數據檢索出來返回給MySQL服務器。
?
索引條件下推優化可以減少存儲引擎查詢基礎表的次數,也可以減少MySQL服務器從存儲引擎接收數據的次數。?
網上搜了下相關的文章不少都將Index Condition Pushdown 稱為索引下推優化,我認為還是索引條件下推優化更合適一些,因為這個優化技術關鍵的操作就是將與索引相關的條件由MySQL服務器向下傳遞至存儲引擎,由此減少IO次數。MySQL服務器到存儲引擎是向下,傳遞的是與索引列相關的查詢條件,所以還是索引條件下推優化更容易理解一些。
適用條件
工作過程
既然是優化,我們要清楚優化了些什么就要了解原本是如何工作的,所以分為兩部分來描述工作過程。
不使用索引條件下推優化時的查詢過程
獲取下一行,首先讀取索引信息,然后根據索引將整行數據讀取出來。然后通過where條件判斷當前數據是否符合條件,符合返回數據。使用索引條件下推優化時的查詢過程
獲取下一行的索引信息。檢查索引中存儲的列信息是否符合索引條件,如果符合將整行數據讀取出來,如果不符合跳過讀取下一行。用剩余的判斷條件,判斷此行數據是否符合要求,符合要求返回數據。EXPLAN分析
當使用explan進行分析時,如果使用了索引條件下推,Extra會顯示Using index condition。并不是Using index因為并不能確定利用索引條件下推查詢出的數據就是符合要求的數據,還需要通過其他的查詢條件來判斷。
圖一:不使用ICP技術(過程使用數字符號標示,如①②③等)
?過程解釋:
①:MySQL Server發出讀取數據的命令,這是在執行器中執行如下代碼段,通過函數指針和handle接口調用存儲引擎的索引讀或全表表讀。此處進行的是索引讀。?
?
?
?
?
if (in_first_read){in_first_read= false;//設定合適的讀取函數,如設定索引讀函數/全表掃描函數error= (*qep_tab->read_first_record)(qep_tab); }else error= info->read_record(info);復制代碼②、③:進入存儲引擎,讀取索引樹,在索引樹上查找,把滿足條件的(經過查找,紅色的滿足)從表記錄中讀出(步驟④,通常有IO),從存儲引擎返回⑤標識的結果。
此處,不僅要在索引行進行索引讀取(通常是內存中,速度快。步驟③),還要進行進行步驟④,通常有IO。
⑥:從存儲引擎返回查找到的多條元組給MySQL Server,MySQL Server在⑦得到較多的元組。
⑦--⑧:⑦到⑧依據WHERE子句條件進行過濾,得到滿足條件的元組。注意在MySQL Server層得到較多元組,然后才過濾,最終得到的是少量的、符合條件的元組。
圖二:使用ICP技術(過程使用數字符號標示,如①②③等)
?
過程解釋:
①:MySQL Server發出讀取數據的命令,過程同圖一。
②、③:進入存儲引擎,讀取索引樹,在索引樹上查找,把滿足已經下推的條件的(經過查找,紅色的滿足)從表記錄中讀出(步驟④,通常有IO),從存儲引擎返回⑤標識的結果。
此處,不僅要在索引行進行索引讀取(通常是內存中,速度快。步驟③),還要在③這個階段依據下推的條件進行進行判斷,不滿足條件的,不去讀取表中的數據,直接在索引樹上進行下一個索引項的判斷,直到有滿足條件的,才進行步驟④,這樣,較沒有ICP的方式,IO量減少。
⑥:從存儲引擎返回查找到的少量元組給MySQL Server,MySQL Server在⑦得到少量的元組。因此比較圖一無ICP的方式,返回給MySQL Server層的即是少量的、符合條件的元組。另外,圖中的部件層次關系,不再進行解釋。
示例
假設有一張people表,包含字段name、address、first_name
索引為(name,address,first_name)
然后我們執行下面的查詢?
?
?
?
SELECT * FROM person WHERE `name` = "1" AND `address` LIKE "%222" and 復制代碼?
如果不使用索引條件下推優化的話,MySQL只能根據索引查詢出name=1的所有行,然后再依次比較是否符合全部條件。
當使用了索引條件下推優化技術后,可以通過索引中存儲的數據判斷當前索引對應的數據是否符合條件,只有符合條件的數據才將整行數據查詢出來。查看執行計劃時發現extra一欄中有Using index condition信息,說明使用了索引下推。
配置?
索引下推優化是默認開啟的。可以通過下面的腳本控制開關
SET optimizer_switch = 'index_condition_pushdown=off'; SET optimizer_switch = 'index_condition_pushdown=on';復制代碼思考
索引下推優化技術其實就是充分利用了索引中的數據,盡量在查詢出整行數據之前過濾掉無效的數據。
由于需要存儲引擎將索引中的數據與條件進行判斷,所以這個技術是基于存儲引擎的,只有特定引擎可以使用。并且判斷條件需要是在存儲引擎這個層面可以進行的操作才可以,比如調用存儲過程的條件就不可以,因為存儲引擎沒有調用存儲過程的能力。
作者:古柏樹下
鏈接:https://juejin.cn/post/6844904017332535304
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
總結
- 上一篇: mysql索引篇之覆盖索引、联合索引、索
- 下一篇: 新零售场景下的AIPL分析