聯合索引使用規則

2021-08-14 09:39:06 字數 1816 閱讀 6722

假設某個表有乙個聯合索引(c1,c2,c3,c4)一下——只能使用該聯合索引的c1,c2,c3部分

a where c1=x and c2=x and c4>x and c3=x

b where c1=x and c2=x and c4=x order by c3

c where c1=x and c4= x group by c3,c2

d where c1=? and c5=? order by c2,c3

e where c1=? and c2=? and c5=? order by c2,c3

有誰知道下面a-e能否可以使用索引!!為什麼?

建立聯合索引

插入2條測試資料

好,我們先來看a選項

我們看解析a這條sql的結果,與索引有關的主要是possible_keys,key,key_len這三項,

possible_keys是指可能會用到的索引,key是當前sql使用到的索引,key_len是索引的使用位元組數

key的值是c1234表示聯合索引用上了,那是不是c1,c2,c3,c4全用上了咧,我們得從key_len分析一下

因為字段型別是char(1),key_len現在等於4表示c1,c2,c3,c4這四個欄位都用上了索引

再接著看b這條sql語句

我們看到key=c1234,表示b使用了聯合索引,key_len=2表示有兩個字段使用了索引,這兩個字段就是c1和c2,這個sql裡面有乙個order by c3,order by不能使用索引,但是卻利用了索引,為什麼這麼說咧,先看c這條sql

key=c1234,表示b使用了聯合索引,key_len=1表示有1個字段使用了索引,這個字段就是c1,與b語句不一樣的是 extra的值

c語句裡面使用了臨時表(using temporary) 和 排序(filesort),

因為組合索引是需要按順序執行的,比如c1234組合索引,要想在c2上使用索引,必須先在c1上使用索引,要想在c3上使用索引,必須先在c2上使用索引,依此。。

回到b語句中,因為c2欄位已經使用了索引,所以在order by c3的時候 c3其實在索引表裡面已經是排好序的了,不需要建臨時表,不需要再排序,所以說其實他利用上了索引

而c語句中,group by 的順序是先c3,再c2,在對c3進行group by的時候,c2欄位上的索引並沒用使用,所以索引在這裡就斷了,只用上了c1乙個欄位的索引

d語句c1欄位使用了索引,c2,c3欄位在order by中是順序執行 所以也利用了索引

e語句c1和c2使用了索引,c3在order by中利用了索引

2013-11-10 00:24:19 上傳

(6.78 kb)

mysql 聯合索引使用規則

從一道有趣的題目開始分析 假設某個表有乙個聯合索引 c1,c2,c3,c4 以下選項哪些字段使用了該索引 a where c1 x and c2 x and c4 x and c3 x b where c1 x and c2 x and c4 x order by c3 c where c1 x a...

mysql聯合索引的使用規則

從一道有趣的題目開始分析 假設某個表有乙個聯合索引 c1,c2,c3,c4 以下選項哪些字段使用了該索引 a where c1 x and c2 x and c4 x and c3 x b where c1 x and c2 x and c4 x order by c3 c where c1 x a...

Mysql聯合索引使用

聯合索引 概念聯合索引又叫復合索引,即乙個覆蓋表中兩列或者以上的索引,例如 index name column a,column b 1建立方式 執行alter table語句時建立 alter table table name add index index name column list 1i...