天天看點

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

    ,直到最後一行資料。
Mysql知識延展(三)索引條件下推

優化器

使用ICP時

,server層将會把

能夠通過使用索引進行評估的where條件下推

storage engine

層。資料通路和提取過程如下:

  1. storage engine從索引中讀取下一條索引元組。
  2. storage engine使用索引元組評估下推的索引條件。如果

    沒有滿足where條件

    ,storage engine将會

    處理下一條索引元組(回到上一步)

    。隻有當索引元組

    滿足下推的索引條件

    的時候,才會繼續去

    基表中讀取資料

  3. 如果

    滿足下推的索引條件

    ,storage engine通過索引元組定位基表的行和

    讀取整行資料并傳回給server層

  4. server層評估沒有被下推到storage engine層的where條件

    ,如果該行資料滿足where條件則使用,否則丢棄。
    Mysql知識延展(三)索引條件下推

索引條件下推的意思就是

篩選字段在索引中的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。

繼續閱讀