MySQL分组(group by)查询优化

        很多场景下,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不再进行文件排序。

结论:

  1. 尽量使用group by 的分组利用到联合索引

  2. 尽量添加order by null避免filesort

好不好使,总得试试吧,哈哈

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值