group by 优化

group by 优化方法--索引

在数据量大的时候group by 逻辑都需要构造一个带唯一索引的表,执行代价都是比较高的。

因为B+树是有序的,所以直接给group by 的字段加上索引,就可以避免创建临时表排序。

group by 优化方法 -- 直接排序

Group by 默认在内存中排序先放到内存临时表,插入一部分数据后,发现内存临时表不够用了再转成磁盘临时表为了避免这种脱了裤子放屁的操作,我们如果知道查出数据量比较大,那就直接进行磁盘排序,给语句加上SQL_BIG_RESULT命令 如下

select SQL_BIG_RESULT id%100 as m, count(*) as c from t1 group by m;

Group by指导原则

  1. 如果对 group by 语句的结果没有排序要求,要在语句后面加 order by null;(这样就跳过了最后排序的阶段,直接从临时表中取数据返回
  2. 尽量让 group by 过程用上表的索引,确认方法是 explain 结果里没有 Using temporary 和 Using filesort;
  3. 如果 group by 需要统计的数据量不大,尽量只使用内存临时表;也可以通过适当调大 tmp_table_size 参数,来避免用到磁盘临时表;
  4. 如果数据量实在太大,使用 SQL_BIG_RESULT 这个提示,来告诉优化器直接使用排序算法得到 group by 的结果。

Guess you like

Origin blog.csdn.net/u010191034/article/details/120120190