| 假設(shè)某個(gè)表有一個(gè)聯(lián)合索引(c1,c2,c3,c4)一下——只能使用該聯(lián)合索引的c1,c2,c3部分A where c1=x and c2=x and c4>x and c3=xB where c1=x and c2=x and c4=x order by c3C where c1=x and c4= x group by c3,c2D where c1=? and c5=? order by c2,c3E where c1=? and c2=? and c5=? order by c2,c3有誰知道下面A-E能否可以使用索引!!為什么? |
創(chuàng)建聯(lián)合索引
插入2條測試數(shù)據(jù)
好,我們先來看A選項(xiàng)
我們看解析A這條sql的結(jié)果,與索引有關(guān)的主要是possible_keys,key,key_len這三項(xiàng),possible_keys是指可能會(huì)用到的索引,key是當(dāng)前sql使用到的索引,key_len是索引的使用字節(jié)數(shù)key的值是c1234表示聯(lián)合索引用上了,那是不是c1,c2,c3,c4全用上了咧,我們得從key_len分析一下因?yàn)樽侄晤愋褪莄har(1),字符集是utf8,所以每個(gè)字段的key_len 是 1*3=3,key_len現(xiàn)在等于12表示c1,c2,c3,c4這四個(gè)字段都用上了索引,(如果字段類型是null,那單個(gè)字段的索引字節(jié)數(shù)需要 +1,如果字段類型為非定長類型,比如varchar,那字節(jié)數(shù)需要再 +2,這里方便理解,統(tǒng)一定義成了定長char)再接著看B這條sql語句 我們看到key=c1234,表示B使用了聯(lián)合索引,key_len=6表示有兩個(gè)字段使用了索引,這兩個(gè)字段就是C1和c2,這個(gè)sql里面有一個(gè)order by c3,order by不能使用索引,但是卻利用了索引,為什么這么說咧,先看C這條sql key=c1234,表示B使用了聯(lián)合索引,key_len=3表示有1個(gè)字段使用了索引,這個(gè)字段就是C1,與B語句不一樣的是 Extra的值C語句里面使用了臨時(shí)表(Using temporary) 和 排序(filesort),因?yàn)榻M合索引是需要按順序執(zhí)行的,比如c1234組合索引,要想在c2上使用索引,必須先在c1上使用索引,要想在c3上使用索引,必須先在c2上使用索引,依此。。回到B語句中,因?yàn)閏2字段已經(jīng)使用了索引,所以在order by c3的時(shí)候 c3其實(shí)在索引表里面已經(jīng)是排好序的了,不需要建臨時(shí)表,不需要再排序,所以說其實(shí)他利用上了索引而C語句中,group by 的順序是先c3,再c2,在對c3進(jìn)行g(shù)roup by的時(shí)候,c2字段上的索引并沒用使用,所以索引在這里就斷了,只用上了c1一個(gè)字段的索引 |
E語句c1和c2使用了索引,c3在order by中利用了索引
2013-11-10 00:24:19 上傳下載附件 (6.78 KB)新聞熱點(diǎn)
疑難解答