联合索引只用单字段时是否用到索引

 

多字段的联合索引在查询单个字段时是否可以用到索引

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

 

posted @ 2020-03-27 23:30  Elton丶  阅读(4606)  评论(0编辑  收藏  举报