联合索引又叫复合索引。对于复合索引:mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
从一道有趣的题目开始分析:
假设某个表有一个联合索引(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
下面我们开始:
首先创建表:
1
2
3
4
5
6
7
|
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(与计算索引使用字节数有关)
创建索引:
1
|
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联合索引的使用规则的文章就介绍到这了,更多相关mysql联合索引内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!
原文链接:https://blog.csdn.net/wdjxxl/article/details/79790421