聯合索引只用單字段時是否用到索引
多字段的聯合索引在查詢單個字段時是否可以用到索引
1、聯合索引是由多個字段組成的索引。
2、查詢時使用聯合索引的一個字段,如果這個字段在聯合索引中所有字段的第一個,那就會用到索引,否則就無法使用到索引。
3、聯合索引IDX(字段A,字段B,字段C,字段D),當僅使用字段A查詢時,索引IDX就會使用到;如果僅使用字段B或字段C或字段D查詢,則索引IDX都不會用到。
這個規則在oracle和mysql數據庫中均成立。
如果你經常要用到多個字段的多條件查詢,可以考慮建立聯合索引,一般是除第一個字段外的其它字段不經常用于條件篩選情況,比如說a,b 兩個字段,如果你經常用a條件或者a+b條件去查詢,而很少單獨用b條件查詢,那么可以建立a,b的聯合索引。如果a和b都要分別經常獨立的被用作查詢條件,那還是建立多個單列索引。
索引的定義是 快速、高效地查詢數據的數據結構。
索引的本質就是 數據結構。 可以理解為 排好序的、快速查找的數據結構。
mysql 中,索引有 單列索引,也有 多列索引 。
(1)單列索引 就是常用的一個列字段的索引,常見的索引。
(2)多列索引 就是含有多個列字段的索引 。
多列索引,也叫 多列組合索引、復合索引 、聯合索引。
多列索引

示例:
where a=3 and b=45 and c=5 # 這種三個索引順序使用中間沒有斷點,全部發揮作用;
where a=3 and c=5 # 這種情況下,b就是斷點,a有效,c無效
where b=3 and c=4 # 這種情況下,a就是斷點,在a后面的索引全部無效
where b=45 and c=5 and a=3 # 這個跟第一個一樣,全部有效, abc跟書寫的順序無關
注意, ( a ,b ,c ) 索引 和 ( a ,c ,b ) 是不同的索引
(1) select * from mytable where a=3 and b=5 and c=4;
# abc 三列都使用索引,而且都有效
(2) select * from mytable where c=4 and b=6 and a=3;
# mysql沒有那么笨,不會因為書寫順序而無法識辨索引。
# where里面的條件順序在查詢之前會被mysql自動優化,效果跟上一句一樣。
(3) select * from mytable where a=3 and c=7;
# a 用到索引,sql中沒有使用 b列,b列中斷,c沒有用到索引
(4) select * from mytable where a=3 and b>7 and c=3;
# a 用到索引,b也用到索引,c沒有用到。
# 因為 b是范圍索引,所以b處斷點,復合索引中后序的列即使出現,索引也是無效的。
(5) select * from mytable where b=3 and c=4;
# sql中沒有使用a列, 所以b,c 就無法使用到索引
(6) select * from mytable where a>4 and b=7 and c=9;
# a 用到索引, a是范圍索引,索引在a處中斷, b、c沒有使用索引
(7) select * from mytable where a=3 order by b;
# a用到了索引,b在結果排序中也用到了索引的效果。前面說過,a下面任意一段的b是排好序的
(8) select * from mytable where a=3 order by c;
# a 用到了索引,sql中沒有使用 b列,索引中斷,c處沒有使用索引,在 Extra列 可以看到 filesort
(9) select * from mytable where b=3 order by a;
# 此sql中,先b,后a,導致 b=3 索引無效,排序a也索引無效。

浙公網安備 33010602011771號