• 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;

    【建索引】

    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';

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

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

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

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

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

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

    c3作用在排序而不是查找

    【索引的两大功能:查找和排序】
    6)
    explain select * from test03 where c1='a1' and c2='a2' order by c3;

    7)
    explain select * from test03 where c1='a1' and c2='a2' order by c4;
    出现了filesort

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

    只用c1一个字段索引,但是c2、c3用于排序,无filesort
    8.2
    explain select * from test03 where c1='a1' and c5='a5' order by c3,c2;

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

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

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

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

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

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

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

    filesort出现

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

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

    Using where; Using temporary; Using filesort

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

    【结论】

    【一般性建议】

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

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

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

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

  • 相关阅读:
    Web 自动化测试(Selenium)认识
    windows 环境下 Tomcat 使用以及Jenkins 监听项目
    ant 环境配置以及 build.xml 文件解析
    requests + pytest + allure 结合使用并生成测试报告
    requests 接口测试
    allure 结合 pytest 生成测试报告
    测试报告——allure框架
    单元测试 pytest 文件读取(CSV, XML)
    单元测试 pytest 模块
    Java中把一个对象复制给另外一个对象引发的思考
  • 原文地址:https://www.cnblogs.com/116970u/p/10987767.html
Copyright © 2020-2023  润新知