索引條件下推(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)定位和讀取整行數據。
-
server層評估where條件
,如果該行數據滿足where條件則使用,否則丟棄。 -
循環執行1
,直到最後一行數據。
優化器使用ICP時
,server層將會把能夠通過使用索引進行評估的where條件下推
到storage engine
層。數據訪問和提取過程如下:
-
storage engine從索引中讀取下一條索引元組。
-
storage engine使用索引元組評估下推的索引條件。如果
沒有滿足where條件
,storage engine將會處理下一條索引元組(回到上一步)
。只有當索引元組滿足下推的索引條件
的時候,纔會繼續去基表中讀取數據
。 -
如果
滿足下推的索引條件
,storage engine通過索引元組定位基表的行和讀取整行數據並返回給server層
。 -
server層評估沒有被下推到storage engine層的where條件
,如果該行數據滿足where條件則使用,否則丟棄。
索引條件下推的意思就是篩選字段在索引中的where條件
從server層下推到storage engine層
,這樣可以在存儲引擎層過濾數據
。由此可見,ICP可以減少存儲引擎訪問基表的次數
和mysql server訪問存儲引擎
的次數。
ICP使用的條件
- 只能用於
二級索引
(secondary index) - explain顯示的執行計劃中
type值
(join 類型)爲range
、ref
、eq_ref
或者ref_or_null
- 查詢需要訪問表的整行數據,即
不能
直接通過二級索引
的元組數據獲得查詢結果
(索引覆蓋) - ICP可以用於
MyISAM
和InnnoDB
存儲引擎,不支持分區表(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。