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


大家好,我是大彬~

今天給大家分享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表初始數據如下:

id name level weapon
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,則表示使用了索引下推。

總結

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM