索引條件下推(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使用的條件
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。
mysql 索引 索引條件下推 ICP
索引條件下推 icp index condition pushdown,簡單的來講,使用索引查詢後,不立即進行回表查詢,通過where條件中的字段 該字段也是位於索引中 進行過濾,將過濾之後的結果進行回表查詢。相對於沒有開啟icp,減少了回表查詢的記錄數 來自官網 假設乙個表包含有關人員及其位址的資...
mysql索引在in條件下失效的原因
1.如果索引欄位是字串,則必須在字段值外加上引號,如 select from notice where villageid in 0 4100000 1.如果資料量很小,mysql會認為掃瞄全表比使用索引快,自然不會使用索引.2.如果查詢結果資料量很多,mysql也不會使用索引.比如style 欄位...
索引在哪些條件下會失效
is null 或is not null操作 判斷字段是否為空 判斷字段是否為空一般是不會應用索引的,因為b樹索引是不索引空值的。select from mtl material transactions mmt where mmt.shipment number is not null 及 操作符...