很多场景下,MySQL使用同样方法优化group by和distinct这两类查询。事实上mysql优化器会在内部处理的时候相互转化这两类查询。它们都可以通过索引来优化,这也是最有效的优化办法。注意要确保任何group by中的表达式只涉及到一个表中的列,这样mysql才有可能使用索引来优化这个过程。
group by 实质是先排序后分组,遵照索引的最佳左前缀。group by 实际上也同样会进行排序操作,与 order by 相比,group by 主要只是多了排序之后的分组操作,所以 group by 同样可以利用到索引,使用规则与order by差不多。具体规则可以参考我的上一篇文章《MySQL排序优化》。如果服务器能够按需要顺序读取数据,那么就不再需要额外的排序操作,并且group by查询也无需再做排序和将行按组进行聚合计算了。
当无法使用索引的时候,group by 使用两种策略来完成:临时表或者文件排序。对于任何查询语句,这两种策略的性能都有可以提升的地方。可以通过使用提示SQL_BIG_RESULT和SQL_SMALL_RESULT来让优化器按照你希望的方式运行。
如果没有通过order by显示指定排序列,当查询使用group by时,结果集会自动按照分组字段进行排序,可在group by子句直接指定desc和asc。如果不关心结果集顺序,而这种默认排序又导致了文件排序,可使用order by null,让mysql不再进行文件排序。
结论:
-
尽量使用group by 的分组利用到联合索引
-
尽量添加order by null避免filesort
好不好使,总得试试吧,哈哈