本文主要介绍mysql联合索引的具体使用,结合实例代码有一定的参考价值。感兴趣的朋友可以参考一下。
联合指数也称为复合指数。对于复合索引:Mysql从左到右使用索引中的字段。一个查询只能使用部分索引,但只能使用最左边的部分。例如,索引是关键索引(a,b,c)。可以支持A | A、B | A、B、C三种组合进行搜索,但不支持B、C进行搜索。当最左边的字段是常量引用时,索引非常有效。
从一个有趣的话题开始分析:
假设一个表有一个联合索引(c1,c2,c3,c4)。以下选项的哪些字段使用索引:
a其中c1=x,c2=x,c4x和c3=x
b其中c1=x,c2=x,c4=x,按c3排序
c其中c1=x和c4=x由c3、c2分组
d其中c1=?而c5=?按c2、c3排序
e其中c1=?而c2=?而c5=?按c2、c3排序
我们开始吧:
首先创建表格:
创建表t(
c1 CHAR(1)不为空,
c2 CHAR(1)不为空,
c3 CHAR(1)不为空,
c4 CHAR(1)不为空,
c5字符(1)不为空
)引擎myisam CHARSET UTF8
从c1到C5有五个字段。特别是,字段类型都是固定长度的char(1)类型,并且不为空。字符集是utf8(与用于计算索引的字节数相关)
创建索引:
更改表t添加索引c1234(c1,c2,c3,C4);
插入两条数据:插入t值( 1 , 1 , 1 , 1 ,( 2 , 2 , 2 )
使用MySql Explain开始分析问题的结果:
选项a:
从结果中可以看出,c1,c2,c3,c4都使用这个指标,但是我们稍微改变了A的结果:
c2条件消除后:
根据最左索引原理,c2字段不使用索引,c2之后的所有字段都不能使用索引。在下图中,我们比较了最左边的索引原理:
上图结果显示,直接使用c3是全表查询,不能使用索引。因此,在c3字段中使用索引的前提是c1和c2字段都使用索引。
即索引最左边的原则(左前缀原则)。
选项b:
key_len的长度表示c1和c2字段使用这个索引,多余的显示不使用临时表进行排序,表示排序是按索引进行的,但不计入key_len的值中,不起到连接c4的作用,表示索引从c3断开。
实际上排序是直接使用联合索引完成的,也就是使用c1234联合索引,c1-c2,c2-c3,c3-c4是有序的,所以索引实际上是用于排序的,而c3字段没有使用索引。(写这一段总觉得有点别扭。不知道理解对不对,需要进一步研究。)
选项c:
使用group by一般教师创建临时文件,然后进行排序,但是当字段顺序为c2和c3时,不使用临时表进行排序,而是使用索引进行排序;当分组依据字段为c3和c2时,索引不用于分组和排序,因为它与索引字段的顺序不一致。
由key_len的长度决定,只索引一个字段c1。
d选项:
排序依据类似于分组依据。当字段顺序与索引一致时,将使用索引排序。当字段的顺序与索引不一致时,不使用索引。
由key_len的长度决定,只索引一个字段c1。
e选项:
其实选项E的结果分析在上面的ABCD结果中已经分析过了,这里只有c1和c2字段使用这个指标。
综上所述,以上问题的答案:
答:所有四个字段都使用这个索引。
B:c1、c2字段使用此索引。
C:c1字段使用此索引。
D:c1字段使用此索引。
E:c1、c2字段使用此索引。
总结:
索引的最左原则(左前缀原则),如(C1、C2、C3、C4)的联合索引.CN),其中根据索引建立的字段顺序使用条件(这并不意味着and条件必须按顺序书写)。如果中间列没有条件,或者使用like将导致后面的列无法使用索引。
索引还可以用于分组和排序。分组要先排序,求平均值。因此,在分组和排序时,如果字段顺序能够遵循索引的字段顺序,就可以利用索引的有序特性。
关于mysql联邦索引规则的这篇文章到此为止。有关mysql联邦索引的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!