mysql 多列索引实例_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 都能用上

mysql 多列索引实例_Mysql多列索引经典案例_第1张图片

mysql 多列索引实例_Mysql多列索引经典案例_第2张图片

分析B => select * from test where c1=1 and c2=2 and c4=3 order by c3

c1 ,c2 索引用上了,在 c2 用到索引的基础上,c3 是排好序的,因此不用额外排序,而 c4 没发挥作用

mysql 多列索引实例_Mysql多列索引经典案例_第3张图片

分析C => select * from test where c1=1 and c4=2 group by c3,c2

只用到 c1 索引,因为 group by c3,c2 的顺序无法利用 c2,c3 索引

mysql 多列索引实例_Mysql多列索引经典案例_第4张图片

分析D => select * from test where c1=1 and c5=2 order by c2,c3

C1 确定的基础上,c2 是有序的,C2 之下 C3 是有序的,因此 c2,c3 发挥的排序的作用. 因此,没用到 filesort

mysql 多列索引实例_Mysql多列索引经典案例_第5张图片

分析E => select * from test where c1=1 and c2=3 and c5=2 order by c3;

因为 c2 的值既是固定的,参与排序时并不考虑

mysql 多列索引实例_Mysql多列索引经典案例_第6张图片

Mysql多列索引经典案例

标签:from   logs   body   索引   image   sort   png   分析   等价

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:http://www.cnblogs.com/yxhblogs/p/8045106.html

你可能感兴趣的:(mysql,多列索引实例)