mysql聯合索引的使用規則

2021-10-05 11:21:01 字數 2495 閱讀 4107

從一道有趣的題目開始分析:

假設某個表有乙個聯合索引(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 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

下面我們開始:

首先建立表:

create table t(

c1 char(1) not null,

c2 char(1) not null,

c3 char(1) not null,

c4 char(1) not null,

c5 char(1) not null

)engine myisam charset utf8;

有c1到c5 5個字段,特別說明一下 字段型別都是定長char(1)型別,並且非空,字符集是utf8(與計算索引使用位元組數有關)

建立索引:

alter table t add index c1234(c1,c2,c3,c4);

插入2條資料:insert into t values('1','1','1','1','1'),('2','2','2','2','2')

使用mysql explain開始分析題目結果:

a選項:

結果可以看出,c1,c2,c3,c4均使用到了該索引,而我們對a結果稍作更改:

將c2條件去掉後:

根據索引最左原則,c2欄位沒有使用索引,c2之後的字段都不能使用索引。下面2圖我們對比下索引最左原則:

上圖結果顯示直接使用c3是全表查詢,無法使用該索引的,所以c3欄位使用索引的前提是c1,c2兩字段均使用了索引。

即是索引的最左原則(左字首原則)。

b選項:

key_len長度說明c1,c2欄位用到了該索引,extra顯示並沒有使用臨時表進行排序,說明排序是使用了索引的,但並沒有計算在key_len值中,也沒有起到連線c4的作用,說明索引到c3這裡是斷掉的。

排序其實是利用聯合索引直接完成了的,即:使用了c1234聯合索引,就已經使得c1下c2,c2下c3,c3下c4是有序的了,所以實際是排序利用了索引,c3欄位並沒有使用該索引。(這段寫的時候總感覺有點彆扭,不知道我理解的對不對,還有待更深層次的研究)

c選項:

使用group by 一般先生成臨時檔案,再進行排序,但是字段順序為c2,c3時,並沒有用臨時表進行排序,而是利用索引排序好的;當group by欄位為c3,c2時,由於與索引字段順序不一致,所以分組和排序並沒有利用到索引。

由key_len長度確定,只有c1乙個字段使用了索引。

d選項:

order by 和group by 類似,字段順序與索引一致時,會使用索引排序;字段順序與索引不一致時,不使用索引。

由key_len長度確定,只有c1乙個字段使用了索引。

e選項:

其實選項e的結果分析在上述abcd的結果中都分析過了,這裡只有c1,c2欄位使用了該索引。

綜上所述問題答案:

a:四個欄位均使用了該索引

b:c1,c2欄位使用了該索引

c:c1欄位使用該索引

d:c1欄位使用該索引

e:c1,c2欄位使用了該索引

總結:索引的最左原則(左字首原則),如(c1,c2,c3,c4....cn)的聯合索引,where 條件按照索引建立的字段順序來使用(不代表and條件必須按照順序來寫),如果中間某列沒有條件,或使用like會導致後面的列不能使用索引。

索引也能用於分組和排序,分組要先排序,在計算平均值等等。所以在分組和排序中,如果字段順序可以按照索引的字段順序,即可利用索引的有序特性。

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...

聯合索引使用規則

假設某個表有乙個聯合索引 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 c...

Mysql聯合索引使用

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