Mysql性能優(yōu)化之索引下推
索引下推(index condition pushdown )簡(jiǎn)稱(chēng)ICP,在Mysql5.6的版本上推出,用于優(yōu)化查詢(xún)。
在不使用ICP的情況下,在使用非主鍵索引(又叫普通索引或者二級(jí)索引)進(jìn)行查詢(xún)時(shí),存儲(chǔ)引擎通過(guò)索引檢索到數(shù)據(jù),然后返回給MySQL服務(wù)器,服務(wù)器然后判斷數(shù)據(jù)是否符合條件 。
在使用ICP的情況下,如果存在某些被索引的列的判斷條件時(shí),MySQL服務(wù)器將這一部分判斷條件傳遞給存儲(chǔ)引擎,然后由存儲(chǔ)引擎通過(guò)判斷索引是否符合MySQL服務(wù)器傳遞的條件,只有當(dāng)索引符合條件時(shí)才會(huì)將數(shù)據(jù)檢索出來(lái)返回給MySQL服務(wù)器 。
索引條件下推優(yōu)化可以減少存儲(chǔ)引擎查詢(xún)基礎(chǔ)表的次數(shù),也可以減少M(fèi)ySQL服務(wù)器從存儲(chǔ)引擎接收數(shù)據(jù)的次數(shù)。
開(kāi)擼在開(kāi)始之前先先準(zhǔn)備一張用戶(hù)表(user),其中主要幾個(gè)字段有:id、name、age、address。建立聯(lián)合索引(name,age)。
假設(shè)有一個(gè)需求,要求匹配姓名第一個(gè)為陳的所有用戶(hù),sql語(yǔ)句如下:
SELECT * from user where name like ’陳%’
根據(jù) '最佳左前綴' 的原則,這里使用了聯(lián)合索引(name,age)進(jìn)行了查詢(xún),性能要比全表掃描肯定要高。
問(wèn)題來(lái)了,如果有其他的條件呢?假設(shè)又有一個(gè)需求,要求匹配姓名第一個(gè)字為陳,年齡為20歲的用戶(hù),此時(shí)的sql語(yǔ)句如下:
SELECT * from user where name like ’陳%’ and age=20
這條sql語(yǔ)句應(yīng)該如何執(zhí)行呢?下面對(duì)Mysql5.6之前版本和之后版本進(jìn)行分析。
Mysql5.6之前的版本5.6之前的版本是沒(méi)有索引下推這個(gè)優(yōu)化的,因此執(zhí)行的過(guò)程如下圖:

會(huì)忽略age這個(gè)字段,直接通過(guò)name進(jìn)行查詢(xún),在(name,age)這課樹(shù)上查找到了兩個(gè)結(jié)果,id分別為2,1,然后拿著取到的id值一次次的回表查詢(xún),因此這個(gè)過(guò)程需要回表兩次。
Mysql5.6及之后版本5.6版本添加了索引下推這個(gè)優(yōu)化,執(zhí)行的過(guò)程如下圖:

InnoDB并沒(méi)有忽略age這個(gè)字段,而是在索引內(nèi)部就判斷了age是否等于20,對(duì)于不等于20的記錄直接跳過(guò),因此在(name,age)這棵索引樹(shù)中只匹配到了一個(gè)記錄,此時(shí)拿著這個(gè)id去主鍵索引樹(shù)中回表查詢(xún)?nèi)繑?shù)據(jù),這個(gè)過(guò)程只需要回表一次。
實(shí)踐當(dāng)然上述的分析只是原理上的,我們可以實(shí)戰(zhàn)分析一下,因此陳某裝了Mysql5.6版本的Mysql,解析了上述的語(yǔ)句,如下圖:

根據(jù)explain解析結(jié)果可以看出Extra的值為Using index condition,表示已經(jīng)使用了索引下推。
總結(jié)索引下推在非主鍵索引上的優(yōu)化,可以有效減少回表的次數(shù),大大提升了查詢(xún)的效率。
關(guān)閉索引下推可以使用如下命令,配置文件的修改不再講述了,畢竟這么優(yōu)秀的功能干嘛關(guān)閉呢:
set optimizer_switch=’index_condition_pushdown=off’;
到此這篇關(guān)于Mysql性能優(yōu)化之索引下推的文章就介紹到這了,更多相關(guān)Mysql 索引下推內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. MySQL分區(qū)的優(yōu)點(diǎn)2. mysql的like模式3. mysql-bin.000001文件的來(lái)源及處理方法4. MYSQL(電話(huà)號(hào)碼,身份證)數(shù)據(jù)脫敏的實(shí)現(xiàn)5. MySQL 字符串函數(shù):字符串截取6. 加密你的Access數(shù)據(jù)庫(kù)asp打開(kāi)方法7. mysql like語(yǔ)句問(wèn)題8. Oracle根據(jù)逗號(hào)拆分字段內(nèi)容轉(zhuǎn)成多行的函數(shù)說(shuō)明9. 什么是Access數(shù)據(jù)庫(kù)10. 如何實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)的備份與恢復(fù)

網(wǎng)公網(wǎng)安備