• Mysql多列索引经典案例


    一个经典的多列索引案例,如题:

    假设某个表有一个联合索引(c1,c2,c3,c4)一下——只能使用该联合索引的 c1,c2,c3 部分
    Awhere c1=x and c2=x and c4>x and c3=x
    B where c1=x and c2=x and c4=x order by c3
    C where c1=x and c4= x group by c3,c2
    D where c1=x and c5=x order by c2,c3
    E where c1=x and c2=x and c5=? order by c2,c3
    

    创建一张测试表

    create table test (
    	c1 tinyint(1) not null default 0,
    	c2 tinyint(1) not null default 0,
    	c3 tinyint(1) not null default 0,
    	c4 tinyint(1) not null default 0,
    	c5 tinyint(1) not null default 0,
    	index c1234(c1,c2,c3,c4)
    );
    //插入两条数据
    insert into test values (1,3,5,6,7),(2,3,9,8,3),(4,3,2,7,5);
    insert into test values (2,4,5,8,7),(1,3,5,8,4),(3,4,2,9,6);
    

    分析A => c1=x and c2=x and c4>x and c3=x <等价> c1=x and c2=x and c3=x and c4>x
    c1,c2,c3,c4 都能用上


    分析B => select * from test where c1=1 and c2=2 and c4=3 order by c3
    c1 ,c2 索引用上了,在 c2 用到索引的基础上,c3 是排好序的,因此不用额外排序,而 c4 没发挥作用


    分析C => select * from test where c1=1 and c4=2 group by c3,c2
    只用到 c1 索引,因为 group by c3,c2 的顺序无法利用 c2,c3 索引


    分析D => select * from test where c1=1 and c5=2 order by c2,c3
    C1 确定的基础上,c2 是有序的,C2 之下 C3 是有序的,因此 c2,c3 发挥的排序的作用. 因此,没用到 filesort


    分析E => select * from test where c1=1 and c2=3 and c5=2 order by c3;
    因为 c2 的值既是固定的,参与排序时并不考虑

  • 相关阅读:
    ASP.NET学习笔记(1)
    vs2005新建项目中没有ASP.NET WEB应用程序
    IE无法安装Activex控件
    【Android】SDK工具学习
    【英语】Bingo口语笔记(22)
    【Python】实践笔记
    【学习】纪录片笔记
    【英语】Bingo口语笔记(20)
    【英文】20141027 生词
    【英文】Bingo口语笔记(18)
  • 原文地址:https://www.cnblogs.com/yxhblogs/p/8045106.html
Copyright © 2020-2023  润新知