mysql查询优化~group by知多少

一 简介:聊聊group by的分组
二 explain体现
    extra下
   1 using tempoary
   2 using tempoary && using filesort
   3 using filesort
   4 none
三 实现方式
  1 定义
    GROUP BY 实际上也同样会进行排序操作,而且与ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作。当然,如果在分组的时候还使用了其他的一些聚合函数,那么还需要一些聚合函数的计算。所以,在GROUP BY 的实现过程中,与 ORDER BY 一样也可以利用到索引。
  2 实现方式
    使用松散(Loose)索引扫描实现 GROUP BY 
   1 单一表查询
   2 Group by中只有最左前缀列,没有其他列
   3 只支持max和min聚合,而且,要聚合的列必须是group by中列所在的索引(未测试)
   4 未被group by引用的索引其他部分必须是常量(不理解)
   5 不支持前缀索引。
  eg
   -- 因为聚合函数不是max或者min
  SELECT c1, SUM(c2) FROM t1 GROUP BY c1;
  -- 因为不符合最左前缀原则
  SELECT c1, c2 FROM t1 GROUP BY c2, c3;
  -- 查询涉及到了索引的一部分,紧跟group by中的列,但是没有常量等值语句,加上 WHERE c3 = const就好了
  SELECT c1, c3 FROM t1 GROUP BY c1, c2;
  2 使用临时表实现 GROUP BY
    处理过程 通过where索引过滤 然后放置在临时表中再进行分组+排序
四 优化
  1 尽量使用group by 的分组利用到联合索引
  2 尽量添加order by null避免filesort
五 总结
本文不保证正确性,资料来源 https://www.cnblogs.com/wingsless/p/5040620.html,只是做总结标记

转载于:https://www.cnblogs.com/danhuangpai/p/10845483.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值