MySQL学习笔记(3)——索引练习

根据之前的MYSQL学习笔记(2)的学习,通过一些小练习来加深对索引的理解。

建下表并插入数据最后建立相关索引:

CREATE TABLE IF NOT EXISTS `test`(
id int PRIMARY KEY auto_increment,
c1 char(10),
c2 char(10),
c3 char(10),
c4 char(10),
c5 char(10)
);

INSERT INTO test(c1,c2,c3,c4,c5) VALUES
('a1','a2','a3','a4','a5'),
('b1','b2','b3','b4','b5'),
('c1','c2','c3','c4','c5'),
('d1','d2','d3','d4','d5'),
('e1','e2','e3','e4','e5');

CREATE INDEX idx_test_c1234 ON test(c1,c2,c3,c4); //添加索引

考察SQL下列语句是否用到索引并分析其原因

1、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ AND c3 > ‘a3’ AND c4 = ‘a4’

该语句c1和c2的索引会被用来查找,c3索引会被用来排序,而c4用不到索引。因此这里只有前三个会用到索引。

2、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ AND c4 > 'a4’AND c3 = ‘a3’

该语句用到四个索引,在执行时MySQL优化器会将该语句顺序编程建立索引的顺序,即

SELECT * FROM test WHERE c1 = 'a1' AND c2 = 'a2' AND c3 = 'a3' AND c4 > 'a4'

在这里插入图片描述
则c1、c2、c3索引将会被用来查找,而c4的索引将会被用来排序。每个索引长度为11,四个一共44.

3、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ AND c4 = ‘a4’ ORDER BY c3

该语句仅仅用到两个索引,下图的ref可知有两个const(常量)即c1和c2 。由于c4缺少了c3,违反了最左前缀原则。所以c4不会用到索引。同样的,c3处没有用到索引查找。
在这里插入图片描述

4、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ ORDER BY c3

和上调语句比较,仅仅差别在没有了c4 = 'a4’这个条件,但结果是一样的。
在这里插入图片描述

5、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ ORDER BY c4

同样的,只用到了两个索引,但是缺少了c3,因此在对c4排序时缺少索引,因此会使用到filesort内排序。
在这里插入图片描述

6、SELECT * FROM test WHERE c1 = ‘a1’ AND c5 = ‘a5’ ORDER BY c2,c3

只用到了c1索引,c2、c3索引用于排序。
在这里插入图片描述

7、SELECT * FROM test WHERE c1 = ‘a1’ AND c5 = ‘a5’ ORDER BY c3,c2

仅仅和上条语句在order by后面顺序对调,但性能差了许多,使用到了文件内排序。这是因为最左前缀原则导致order by后面的语句无法使用索引排序。
在这里插入图片描述

8、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ ORDER BY c2,c3

用到两个索引,order by后面索引用于排序。
在这里插入图片描述

9、SELECT * FROM test WHERE c1 = ‘a1’ AND c2 = ‘a2’ ORDER BY c3,c2

根据第7条来说,order by后面不符合索引顺序,应该产生文件内排序,但是结果很意外:
在这里插入图片描述
并没有用到filesort,这是因为,在where条件中有c2 = ‘a2’这一条件。这一条件的出现使得c2的查询级别变为了const(常量)如上图ref中显示。因此,即使在order by中未按照索引顺序排列,但是c2是个常量,排序并不影响。

10、SELECT * FROM test WHERE c1 = ‘a1’ AND c4 = ‘a4’ GROUP BY c2,c3

查询结果与order by的语句类似,只用到了一个索引查找即c1。

11、SELECT * FROM test WHERE c1 = ‘a1’ AND c4 = ‘a4’ GROUP BY c3,c2

与上面order by不同的是,不仅会用到filesort,还会用到临时表(temporary)。用到filesort的原因不解释,用到临时表是因为group by在分组之前要先排序。排序是将结果放在临时表中。
在这里插入图片描述





发布了3 篇原创文章 · 获赞 5 · 访问量 118

猜你喜欢

转载自blog.csdn.net/spiiiiiiiiiitter/article/details/105361254