group by的理解和优化

因为最近接触到数据分析的一些东西,会经常用到group by.


1 group by的字段加索引是否有效?
 explain select sum(lastweekcomratio),sum(thisweekcomratio) from 
 zjf_channel_comparedappid group by comratiogap  ;
 如果comratiogap 是索引,时间1.6-3,执行计划:
 

 如果comratiogap 不是索引,执行时间3-6s,执行计划:

 group by字段是索引,则不会导致Using filesort,并且查询几乎快了一倍。

2 Using filesort的理解   
如果mysql在排序的时候没有使用到索引那么就会输出using filesort。那上面的sql没有order by,为啥group by会排序呢?
考虑下group by的含义,按照某列的值来分组,这里分组的含义就是把值相等的放到一起,所以在group by的时候一定会先order by然后再进行分组的操作。

MySQL根据sort_buffer_size来判断是否使用磁盘临时文件,如果需要排序的数据能放入sort_buffer_size的内存,则无需使用磁盘临时文件,仅仅使用内存就可以了,此时explain只会输出using filesort 否则需要使用磁盘临时文件explain会输出using temporary;using filesort;这里需要指出:如果使用了Using tempory(磁盘临时文件),那么就需要磁盘IO(很慢),肯定会拉慢sql的执行效率,必须避免;如果使用了Using filesort,此时会做内存中的排序,也会一定程度影响效率。


3 sql改写
如果SQL的条件查询和分组都只是一个表的,可以采取子查询的方式
这SQL的条件查询和分组都只是一个表的,内联后数据就变得臃肿了,这时候再进行条件查询和分组是否太吃亏了,我们可以尝试一下提前进行分组和条件查询,实现方法就是子查询联合内联查询。 
实例:SELECT
    attack_ip,
    country,
    province,
    city,
    line,
    info_update_time AS attack_time,
    sum( attack_count ) AS attack_times 
FROM
    `blacklist_attack_ip`
    INNER JOIN `blacklist_ip_count_date` ON `blacklist_attack_ip`.`attack_ip` = `blacklist_ip_count_date`.`ip` 
WHERE
    `attack_count` > 0 
    AND `date` BETWEEN '2017-10-13 00:00:00' 
    AND '2017-10-13 23:59:59' 
GROUP BY
    `ip`
    LIMIT 10 OFFSET 1000
 改写成:
 (SELECT
    attack_ip,
    country,
    province,
    city,
    line,
    info_update_time AS attack_time,
    sum( attack_count ) AS attack_times 
FROM
    `blacklist_attack_ip` 
WHERE
    `attack_count` > 0 
    AND `date` BETWEEN '2017-10-13 00:00:00' 
    AND '2017-10-13 23:59:59' 
GROUP BY
    `ip`) A     INNER JOIN `blacklist_ip_count_date` ON A.`attack_ip` = `blacklist_ip_count_date`.`ip` 
        LIMIT 10 OFFSET 1000

4 说明下面语句mysql执行顺序       
select t.a,t.b,sum(t1.c) as num from t left join t1 on t.name=t1.name where t.a='a' group by t.b having num>3 order by t.a limit 2;

先执行 where t.a='a'来筛选,然后select内容,然后进行group by和having,最后orderby limit;

参考:https://blog.csdn.net/Tim_phper/article/details/78344444

https://blog.csdn.net/xinyuan_java/article/details/91435745

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "Group by" 和 "Order by" 是 SQL 数据库中常用的查询语句。 "Group by" 用于对查询结果进行分组,以便对每组数据进行统计或计算。 "Order by" 用于对查询结果进行排序,以便按照特定的顺序显示数据。 ### 回答2: 数据库中的group by和order by是两个常用的操作语句,它们都具有对数据进行分类和排序的功能。下面分别表示这两个操作的详细解释。 Group by: Group by是在查询中通过聚合函数对数据进行分类的一种方法。例如,可以通过group by语句将一列数据按照相同的值分为一组,然后对每组数据计算总和、平均值、最大值等。group by语法如下: SELECT column1, column2, …, aggregate_function(columnx) FROM table_name WHERE condition GROUP BY column1, column2, …; 这里的聚合函数指的是对数据进行计算的函数,例如SUM、AVG、COUNT等。group by语句可以让我们更好地理解和分析数据,提高了数据处理的效率。例如,可以使用group by语句对销售数据按照日期、产品类型等进行分类统计,进而对销售策略进行调整。 Order by: order by是一种对数据进行排序的方法,可以按照某一列的值对数据进行升序或降序排列。 order by语法如下: SELECT column1, column2, … FROM table_name WHERE condition ORDER BY column1, column2, … ASC|DESC; 这里的ASC和DESC分别表示升序和降序,可以根据实际需要进行选择。order by语句能够提高数据的可读性和可操作性,例如可以使用order by语句对产品销售数据进行时间、地域等方面的排序,以更好地进行数据分析和决策。 总之,group by和order by语句是数据库操作中最常用的两个语句之一,它们有很大的相似性,但具有自己的特点和应用场景。在实际应用中,我们需要根据数据的不同特点灵活使用这两种语句,以达到更好的数据处理效果。 ### 回答3: 数据库中的group by和order by是两个核心的查询语句,它们通常用于对查询结果进行分组排序。 group by是指按照某个字段进行分组聚合,在数据量庞大的情况下可以统计数据,方便数据分析。例如我们需要了解某个城市的销售业绩,可以按照城市名称对销售数据进行分组统计。此时,group by语句可以按照城市名称进行分组,将数据聚合到不同的城市中,方便我们对业绩进行分析。同时group by语句也可以用于去重操作,例如对于一张用户地址表,我们可以使用group by来对地址进行去重,以便得到唯一的地址列表。 order by是按照某个字段排序,包括升序和降序。对于需要多个排序条件的查询语句,我们可以通过order by来实现。例如,在一个学生信息表中,我们需要按照年龄和成绩进行排序,可以使用order by将数据按照年龄排序,并对相同年龄的数据按照成绩进行排序。这样可以使数据变得更加有序、直观。 需要注意的是,group by和order by语句都会对查询效率产生影响。当数据量较大时,group by和order by会对数据库的性能造成一定的影响。因此,我们需要合理使用这两个查询语句,对查询结果进行过滤和优化,从而得到高效、准确的查询结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值