聯合索引只用單字段時是否用到索引


 

多字段的聯合索引在查詢單個字段時是否可以用到索引

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也索引無效。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM