Mysql group by ,order by

MySQL 无法根据索引的顺序来帮助 GROUP BY 的实现,只能先通过索引范围扫描得到需要的数据,将数据存入临时表,然后再进行排序和分组操作来完成 GROUP BY。

对于上面三种 MySQL 处理 GROUP BY 的方式,可以针对性地得出如下两种优化思路:

(1)尽可能让 MySQL利用索引来完成 GROUP BY 操作,当然最好是松散索引扫描的方式。在系统允许的情况下,可以通过调整索引或调整 Query 这两种方式来达到目的;

(2)当无法使用索引完成 GROUP BY时,由于要使用到临时表且需要 filesort,所以必须要有足够的 sort_buffer_size供 MySQL排序时使用,而且尽量不要进行大结果集的 GROUP BY 操作,因为如果超出系统设置的临时表大小就会出现将临时表数据复制(copy)到磁盘上面再进行操作的情况,这时的排序分组操作性能将成数量级的下降。

至于如何利用好这两种思路,还须要大家在实际应用场景中不断地尝试并测试效果,才能最终得到较佳方案。此外,在优化 GROUP BY时还有一个小技巧可以让我们在有些无法利用到索引的情况下避免 filesort 操作,即在整个语句最后添加一个以 null 排序(ORDER BY null)的子句

请使用浏览器的分享功能分享到微信等