在线QQ客服:1922638
专业的SQL Server、MySQL数据库同步软件
从一个有趣的问题开始:
假定一个表具有联合索引(c1,c2,c3,c4),以下选项哪些字段使用索引:
A,其中,c1 = x,c2 = x,c4。 x和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)不为null,
c2 CHAR(1)不为null,
c3 CHAR(1)不为null,
c4 CHAR(1)不为null,
c5 CHAR(1)不为空
)引擎myisam CHARSET UTF8;
从c1到c5有5个字段。特别是,字段类型都是固定长度char(1)类型,并且不为空。字符集为utf8(与用于计算索引的字节数有关)。
创建索引:
alter table t添加索引c1234(c1,c2,c3,c4);
插入2条数据:插入t值(” 1″,” 1″,” 1″,” 1″,” 1″),(” 2″,” 2″,” 2″,” 2″) “,” 2″)
使用MySql Explain开始分析问题的结果:
一个选项:
可以看到结果,索引用于c1,c2,c3,c4,我们稍微改变了A的结果:
删除c2条件后:
根据最左侧的索引编制原则,c2字段不使用索引,c2之后的字段不能使用索引。在下面的两张图片中,我们比较了索引的最左端原理:
上面的结果表明,直接使用c3是一个全表查询,并且无法使用索引,因此对c3字段使用索引的前提是c1和两个字段c2的索引。
是索引的最左端原理(左前缀原理)。
B选项:
key_len的长度表示在字段c1和c2中使用了索引。 Extra显示临时表未用于排序,表明该排序使用索引,但不是在key_len值中计算的,也不发挥连接c4的作用,表明此处到c3的索引已损坏。
实际上,排序是直接通过联合索引完成的,即:使用c1234联合索引,它已经按照c1在c1,c3在c2和c3在c3的顺序进行排序,因此排序实际上使用索引,c3字段不使用此索引。 (在撰写本段时,我总是有点尴尬,不知道自己是否理解正确,需要进一步研究)
C选项:
使用group by通常会在排序之前生成临时文件,但是当字段顺序为c2,c3时,临时表不用于排序,而索引用于排序;当group by字段为c3时,c2由于索引字段的顺序不一致,因此该索引不用于分组和排序。
由key_len的长度决定,只有c1的一个字段使用索引。
D选项:
order by类似于group by。当字段顺序与索引一致时,将使用索引排序。当字段顺序与索引不一致时,将不使用索引。
由key_len的长度决定,只有c1的一个字段使用索引。
E选项:
实际上,在以上ABCD结果中已经对选项E的结果进行了分析。在这里,只有c1和c2字段使用此索引。
总结上述问题的答案:
答:索引在所有四个字段中使用
B:c1,c2字段使用此索引
C:c1字段使用此索引
D:c1字段使用此索引
E:c1,c2字段使用此索引
摘要:
索引的最左原则(左前缀原则),例如(c1,c2,c3,c4….cN)联合索引,其中条件按由索引建立的字段的顺序使用(确实(如果没有条件,则条件必须按顺序写),如果中间没有任何条件,或者使用like会导致后续的列无法使用索引。
索引也可以用于分组和排序。在计算平均值等时,必须首先对分组进行排序。因此,在分组和排序中,如果字段顺序可以符合索引字段的顺序,则可以利用索引的排序性质。 >
?