mysql联合索引的原理,mysql联合索引的原理的一道题

bc3f9276acf88283a0569b9b9ef9ee92.png

在线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开始分析问题的结果:

一个选项:

1f051056b9ee5a12240c8186c9367975.png

可以看到结果,索引用于c1,c2,c3,c4,我们稍微改变了A的结果:

删除c2条件后:

ce476a4bde05e399567ad817fd308a34.png

根据最左侧的索引编制原则,c2字段不使用索引,c2之后的字段不能使用索引。在下面的两张图片中,我们比较了索引的最左端原理:

dac5f9b5ca45bba113149fbb943a9f43.png

上面的结果表明,直接使用c3是一个全表查询,并且无法使用索引,因此对c3字段使用索引的前提是c1和两个字段c2的索引。

是索引的最左端原理(左前缀原理)。

B选项:

53e73c52cdd05d0fdf4d934da32c9a1d.png

key_len的长度表示在字段c1和c2中使用了索引。 Extra显示临时表未用于排序,表明该排序使用索引,但不是在key_len值中计算的,也不发挥连接c4的作用,表明此处到c3的索引已损坏。

实际上,排序是直接通过联合索引完成的,即:使用c1234联合索引,它已经按照c1在c1,c3在c2和c3在c3的顺序进行排序,因此排序实际上使用索引,c3字段不使用此索引。 (在撰写本段时,我总是有点尴尬,不知道自己是否理解正确,需要进一步研究)

C选项:

06504348ffb19baab5e8f75e798404ca.png

使用group by通常会在排序之前生成临时文件,但是当字段顺序为c2,c3时,临时表不用于排序,而索引用于排序;当group by字段为c3时,c2由于索引字段的顺序不一致,因此该索引不用于分组和排序。

由key_len的长度决定,只有c1的一个字段使用索引。

D选项:

bb3ad09fd58726098e6ed9c98e573410.png

order by类似于group by。当字段顺序与索引一致时,将使用索引排序。当字段顺序与索引不一致时,将不使用索引。

由key_len的长度决定,只有c1的一个字段使用索引。

E选项:

d3f9f68aee3417341c6bf82f724869df.png

实际上,在以上ABCD结果中已经对选项E的结果进行了分析。在这里,只有c1和c2字段使用此索引。

总结上述问题的答案:

答:索引在所有四个字段中使用

B:c1,c2字段使用此索引

C:c1字段使用此索引

D:c1字段使用此索引

E:c1,c2字段使用此索引

摘要:

索引的最左原则(左前缀原则),例如(c1,c2,c3,c4….cN)联合索引,其中条件按由索引建立的字段的顺序使用(确实(如果没有条件,则条件必须按顺序写),如果中间没有任何条件,或者使用like会导致后续的列无法使用索引。

索引也可以用于分组和排序。在计算平均值等时,必须首先对分组进行排序。因此,在分组和排序中,如果字段顺序可以符合索引字段的顺序,则可以利用索引的排序性质。 >

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值