mysql 索引 面试题_MySQL索引面试题分析(索引分析,典型题目案例)

【建表语句】

create table test03(

id int primary key not null auto_increment,

c1 char(10),

c2 char(10),

c3 char(10),

c4 char(10),

c5 char(10)

);

insert into test03(c1,c2,c3,c4,c5) values('a1','a2','a3','a4','a5');

insert into test03(c1,c2,c3,c4,c5) values('b1','b2','b3','b4','b5');

insert into test03(c1,c2,c3,c4,c5) values('c1','c2','c3','c4','c5');

insert into test03(c1,c2,c3,c4,c5) values('d1','d2','d3','d4','d5');

insert into test03(c1,c2,c3,c4,c5) values('e1','e2','e3','e4','e5');

select * from test03;

16507910e555d04a620c5115bdb4bfc4.png

【建索引】

create index idx_test03_c1234 on test03(c1,c2,c3,c4);

show index from test03;

问题:我们创建了复合索引idx_test03_c1234 ,根据以下SQL分析下索引使用情况?

1 explain select * from test03 where c1='a1';2 explain select * from test03 where c1='a1' and c2='a2';3 explain select * from test03 where c1='a1' and c2='a2' and c3='a3';4 explain select * from test03 where c1='a1' and c2='a2' and c3='a3' and c4='a4';

1)

explain select * from test03 where c1='a1' and c2='a2' and c3='a3' and c4='a4';

70bc2d39b3f64f39fa270d2d7ee3b999.png

2)

explain select * from test03 where c1='a1' and c2='a2' and c4='a4' and c3='a3';

97b8214057ebe99d9493ce6430e6d7d6.png

explain select * from test03 where c4='a4' and c3='a3' and c2='a2' and c1='a1';

d97ab3f36ecb3a803075e23fde993895.png

3)

explain select * from test03 where c1='a1' and c2='a2' and c3>'a3' and c4='a4';

28f57917d9eebbf509f4d5ce112a80dd.png

4)

explain select * from test03 where c1='a1' and c2='a2' and c4>'a4' and c3='a3';

c74a9ed1c4689af4e6d6e788e8ceef55.png

说明:4个索引全部使用,虽然c3在最后,但是mysql可以自动调优。

5)

explain select * from test03 where c1='a1' and c2='a2' and c4='a4' order by c3;

c3作用在排序而不是查找

842234847ea80286c89c45fecd9b9bd9.png

【索引的两大功能:查找和排序】

6)

explain select * from test03 where c1='a1' and c2='a2' order by c3;

b26924d014d4e42d5fe88e84779671cc.png

7)

explain select * from test03 where c1='a1' and c2='a2' order by c4;

出现了filesort

f382fd26d44c69f1125084bded9f4a5e.png

8)

8.1

explain select * from test03 where c1='a1' and c5='a5' order by c2,c3;

23aadd0abc1af1dbdc99381b3e0df017.png

只用c1一个字段索引,但是c2、c3用于排序,无filesort

8.2

explain select * from test03 where c1='a1' and c5='a5' order by c3,c2;

c68c0de0b58c489c8a4e125f8c602fff.png

出现了filesort,我们建的索引是1234,它没有按照顺序来,3 2 颠倒了

9)

explain select * from test03 where c1='a1' and c2='a2' order by c2,c3;

e8e7d7b0b6420f6053e977611925fd3d.png

10)

explain select * from test03 where c1='a1' and c2='a2' and c5='a5' order by c2,c3;

c1f387741ba3bbab8d727994a78ff864.png

用c1、c2两个字段索引,但是c2、c3用于排序,无filesort

explain select * from test03 where c1='a1' and c2='a2' and c5='a5' order by c3,c2;

1544f64718966b5e6b7a4c0ffc01eb52.png

本例有常量c2的情况,和8.2对比(c2='c2'已经有具体值,为常量时,无需排序)

explain select * from test03 where c1='a1' and c5='a5' order by c3,c2;

326e455d8cbd1afe81629828e837b692.png

filesort出现

11)

explain select * from test03 where c1='a1' and c4='a4' group by c2,c3;

5bc611c00e0f06334d7162c94a50e253.png

12)

explain select * from test03 where c1='a1' and c4='a4' group by c3,c2;

f2b5e74cf4775f1c78e64f35083da284.png

Using where; Using temporary; Using filesort

【group by表面理解为分组,但是要注意的是,分组之前必排序】

【结论】

fad372552edb7715926c83d4c7769609.png

【一般性建议】

1、对于单键索引,尽量选择针对当前query过滤性更好的索引

2、在选择组合索引的时候,当前Query中过滤性最好的字段在索引字段顺序中,位置越靠前(左)越好。(避免索引过滤性好的索引失效)

3、在选择组合索引的时候,尽量选择可以能够包含当前query中的where字句中更多字段的索引

4、尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值