1. 针对where,group by,order by子句优化
-
优化group by语句
默认情况下,MySQL对所有GROUP BY col1,col2...的字段进行排序。这与在查询中指定ORDER BY col1,col2...类似。因此,如果显式包括一个包含相同的列的ORDER BY子句,则对MySQL的实际执行性能没有什么影响。 如果查询包括GROUP BY 但用户想要避免排序结果的消耗,则可以指定ORDER By NULL禁止排序,例如:
explain select id, sum(moneys) from sales2 group by id \G
explain select id, sum(moneys) from sales2 group by id order by null \G
可以看到,第二个执行计划中,并没有using filesort,而恰恰filesort是最耗时的
2. 优化order by语句
在某些情况下,mysql可以使用一个索引来满足order by子句,因为我们的索引是用B Tree建立的,所以建立的过程已经对该列进行了排序。但在具体编写sql语句的时候,我们还要注意编写的sql是否能准确利用索引
- 案例
explain select * from employees order by birth_date;
explain select emp_no,birth_date order by birth_date;
第一条sql语句没有用到索引,而是用了全文检索filesorting,分析原因:因为birth_date是辅助索引,只能通过birth_date查询到主键即emp_no。而我们的select *
则需要所有列的信息,这时候就需要回表,即再次到主索引树搜索一次,这是查询优化器会自动使用filesorting进行文件排序而不使用birth_date的索引,但如果我们把select *
改为select emp_no,birth_date
则会使用birth_date索引
网友评论