MySQL索引下推,原來這麼簡單!

程式設計師大彬發表於2022-03-05

大家好,我是大彬~

今天給大家分享MySQL的索引下推。

什麼是索引下推

索引條件下推,也叫索引下推,英文全稱Index Condition Pushdown,簡稱ICP。

索引下推是MySQL5.6新新增的特性,用於優化資料的查詢。

在MySQL5.6之前,通過使用非主鍵索引進行查詢的時候,儲存引擎通過索引查詢資料,然後將結果返回給MySQL server層,在server層判斷是否符合條件

在MySQL5.6及以上版本,可以使用索引下推的特性。當存在索引的列做為判斷條件時,MySQL server將這一部分判斷條件傳遞給儲存引擎,然後儲存引擎會篩選出符合MySQL server傳遞條件的索引項,即在儲存引擎層根據索引條件過濾掉不符合條件的索引項,然後回表查詢得到結果,將結果返回給MySQL server。

可以看到,有了索引下推的優化,在滿足一定的條件下,儲存引擎層會在回表查詢之前對資料進行過濾,可以減少儲存引擎回表查詢的次數

舉個例子

假設有一張使用者資訊表user_info,有三個欄位name, level, weapon(裝備),建立聯合索引(name, level),user_info表初始資料如下:

idnamelevelweapon
1大彬1鍵盤
2蓋聶2淵虹
3衛莊3鯊齒
4大鐵錘4鐵錘

假如需要匹配姓名第一個字為"大",並且level為1的使用者,SQL語句如下:

SELECT * FROM user_info WHERE name LIKE "大%" AND level = 1;

那麼這條SQL具體會怎麼執行呢?

下面分情況進行分析。

先來看看MySQL5.6以前的版本

前面提到MySQL5.6以前的版本沒有索引下推,其執行過程如下:

查詢條件name LIKE 不是等值匹配,根據最左匹配原則,在(name, level)索引樹上只用到name去匹配,查詢到兩條記錄(id為1和4),拿到這兩條記錄的id分別回表查詢,然後將結果返回給MySQL server,在MySQL server層進行level欄位的判斷。整個過程需要回表2次

然後看看MySQL5.6及以上版本的執行過程,如下圖。

相比5.6以前的版本,多了索引下推的優化,在索引遍歷過程中,對索引中的欄位先做判斷,過濾掉不符合條件的索引項,也就是判斷level是否等於1,level不為1則直接跳過。因此在(name, level)索引樹只匹配一個記錄,之後拿著此記錄對應的id(id=1)回表查詢全部資料,整個過程回表1次

可以使用explain檢視是否使用索引下推,當Extra列的值為Using index condition,則表示使用了索引下推。

總結

從上面的例子可以看出,使用索引下推在某些場景下可以有效減少回表次數,從而提高查詢效率。

碼字不易,如果覺得對你有幫助,可以點個贊鼓勵一下!

相關文章