【云圖說】第132期 小云妹帶您快速玩轉RDS實例操作(2)——刪除與退訂
1034
2025-04-03
大家好,我是大彬~
今天給大家分享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表初始數據如下:
假如需要匹配姓名第一個字為"大",并且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,則表示使用了索引下推。
總結
從上面的例子可以看出,使用索引下推在某些場景下可以有效減少回表次數,從而提高查詢效率。
碼字不易,如果覺得對你有幫助,可以點個贊鼓勵一下!
MySQL SQL Server
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。