索引條件下推(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時
,資料通路和提取的過程如下:
- 當storage engine讀取下一行時,首先讀取索引元組(index tuple),然後使用索引元組在基表中(base table)定位和讀取整行資料。
-
,如果該行資料滿足where條件則使用,否則丢棄。server層評估where條件
-
,直到最後一行資料。循環執行1

優化器
使用ICP時
,server層将會把
能夠通過使用索引進行評估的where條件下推
到
storage engine
層。資料通路和提取過程如下:
- storage engine從索引中讀取下一條索引元組。
- storage engine使用索引元組評估下推的索引條件。如果
,storage engine将會沒有滿足where條件
。隻有當索引元組處理下一條索引元組(回到上一步)
的時候,才會繼續去滿足下推的索引條件
。基表中讀取資料
- 如果
,storage engine通過索引元組定位基表的行和滿足下推的索引條件
。讀取整行資料并傳回給server層
-
,如果該行資料滿足where條件則使用,否則丢棄。server層評估沒有被下推到storage engine層的where條件
Mysql知識延展(三)索引條件下推
索引條件下推的意思就是
篩選字段在索引中的where條件
從
server層下推到storage engine層
,這樣可以在
存儲引擎層過濾資料
。由此可見,ICP可以
減少存儲引擎通路基表的次數
和
mysql server通路存儲引擎
的次數。
ICP使用的條件
- 隻能用于
(secondary index)二級索引
- explain顯示的執行計劃中
(join 類型)為type值
、range
、ref
或者eq_ref
ref_or_null
- 查詢需要通路表的整行資料,即
直接不能
的元組資料獲得通過二級索引
(索引覆寫)查詢結果
- ICP可以用于
和MyISAM
存儲引擎,不支援分區表(5.7将會解決這個問題)InnnoDB
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。