在看高性能mysql的時(shí)候突那,看到一段關(guān)于mysql5.6的索引條件推送的一段話。
來自于5.3.6 索引覆蓋
大概的意思是:沒有ICP(index condition pushdown)前姻几,過濾條件是傳輸不到存儲(chǔ)引擎層的,過濾條件只在服務(wù)器層發(fā)生作用势告,服務(wù)器層只是從存儲(chǔ)引擎中取索引蛇捌,然后在服務(wù)層where過濾,然后再?gòu)拇鎯?chǔ)引擎中取索引咱台,如此循環(huán)络拌,直到取到數(shù)據(jù)。(服務(wù)層取到的數(shù)據(jù)是放在內(nèi)存回溺,然后where操作也是在內(nèi)存進(jìn)行春贸,所以說,索引小遗遵,能夠節(jié)省內(nèi)存)
有了ICP萍恕,則直接把索引過濾條件,發(fā)送到存儲(chǔ)引擎车要,存儲(chǔ)引擎直接返回過濾后的數(shù)據(jù)允粤,服務(wù)層不需要再進(jìn)行過濾了。
但是:
1翼岁、ICP只能用于二級(jí)索引类垫。(做過測(cè)試聚簇索引沒有ICP)
2、explain顯示的執(zhí)行計(jì)劃中type值(join 類型)為range琅坡、 ref悉患、 eq_ref或者ref_or_null。且查詢需要訪問表的整行數(shù)據(jù)榆俺,即不能直接通過二級(jí)索引的元組數(shù)據(jù)獲得查詢結(jié)果(索引覆蓋)售躁。(做過測(cè)試覆蓋索引沒有ICP )
做個(gè)測(cè)試:
mysql 版本5.7
開啟ICP:
Using index condition說明使用了ICP
如果不開啟ICP坞淮,則執(zhí)行計(jì)劃為如下,extra里顯示服務(wù)層使用了where過濾
并且陪捷,開啟了ICP碾盐,
執(zhí)行這條select語句,不會(huì)鎖住title <> ‘’的這條記錄揩局,如果不開啟ICP,則會(huì)使用鎖住title <> 的這條記錄掀虎。
堵塞了:
原因是凌盯,不開啟的時(shí)候,執(zhí)行計(jì)劃顯示烹玉,存儲(chǔ)引擎執(zhí)行的type為range驰怎,范圍查詢,所以存儲(chǔ)引擎鎖住的只是title > 和 title < 的范圍二打,而<>是服務(wù)層做的县忌,所以<>也在這個(gè)范圍內(nèi),被鎖住了继效。
而如果開啟了ICP症杏,則服務(wù)層沒有做where過濾,存儲(chǔ)引擎做了瑞信,所以沒有鎖<>跳的這條記錄厉颤。
高性能mysql這么解釋(來自于5.3.11索引和鎖):