Mysql知識延展(三)索引條件下推

索引條件下推(ICP)

ICP(index condition pushdown)是mysql利用索引(二級索引)元組篩選字段在索引中的where條件從表中提取數據記錄的一種優化操作
ICP的思想是:存儲引擎在訪問索引的時候檢查篩選字段在索引中的where條件(pushed index condition,推送的索引條件),如果索引元組中的數據不滿足推送的索引條件,那麼就過濾掉該條數據記錄。ICP(優化器)儘可能的把index condition的處理從server層下推到storage engine層。storage engine使用索引過濾不相關的數據,僅返回符合index condition條件的數據給server層。也是說數據過濾儘可能在storage engine層進行,而不是返回所有數據給server層,然後後再根據where條件進行過濾。
使用ICP(mysql 5.6版本以前)和沒有使用ICP的數據訪問和提取過程如下:
優化器沒有使用ICP時,數據訪問和提取的過程如下:

  1. 當storage engine讀取下一行時,首先讀取索引元組(index tuple),然後使用索引元組在基表中(base table)定位和讀取整行數據。

  2. server層評估where條件,如果該行數據滿足where條件則使用,否則丟棄。

  3. 循環執行1,直到最後一行數據。

在這裏插入圖片描述
優化器使用ICP時,server層將會把能夠通過使用索引進行評估的where條件下推storage engine層。數據訪問和提取過程如下:

  1. storage engine從索引中讀取下一條索引元組。

  2. storage engine使用索引元組評估下推的索引條件。如果沒有滿足where條件,storage engine將會處理下一條索引元組(回到上一步)。只有當索引元組滿足下推的索引條件的時候,纔會繼續去基表中讀取數據

  3. 如果滿足下推的索引條件,storage engine通過索引元組定位基表的行和讀取整行數據並返回給server層

  4. server層評估沒有被下推到storage engine層的where條件,如果該行數據滿足where條件則使用,否則丟棄。
    在這裏插入圖片描述

索引條件下推的意思就是篩選字段在索引中的where條件server層下推到storage engine層,這樣可以在存儲引擎層過濾數據。由此可見,ICP可以減少存儲引擎訪問基表的次數mysql server訪問存儲引擎的次數。

ICP使用的條件
  • 只能用於二級索引(secondary index)
  • explain顯示的執行計劃中type值(join 類型)爲rangerefeq_ref或者ref_or_null
  • 查詢需要訪問表的整行數據,即不能直接通過二級索引的元組數據獲得查詢結果(索引覆蓋)
  • ICP可以用於MyISAMInnnoDB存儲引擎,不支持分區表(5.7將會解決這個問題)
ICP優化功能的開啓與關閉

index_condition_push優化功能,默認開啓

MySQL5.6可以通過設置optimizer_switch([global|session],dynamic)變量開啓或者關閉
mysql > set optimizer_switch=’index_condition_pushdown=on|off’

用explain查看執行計劃時,如果執行計劃中的Extra信息爲“using index condition”,表示優化器使用的ICP。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章