大家好,我是大彬~
今天給大家分享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
,則表示使用了索引下推。
總結
從上面的例子可以看出,使用索引下推在某些場景下可以有效減少回表次數,從而提高查詢效率。
碼字不易,如果覺得對你有幫助,可以點個贊鼓勵一下!