解决 SQL 子查询 group by去重 索引失效 的一种思路

子查询和索引一直是性能优化的常客

查询简单的时候还好办,拿掉子查询,先join再group by聚合

碰到复杂的查询,里外查询维度不统一,还牵扯到别的计算指标,有点难搞

用临时表是可行的,写过程,创建临时表,加索引,删掉临时表。

这里提供另一种思路:

如果where子句的过滤条件和子查询有关,多写一遍过滤条件就可以避免全表扫描了。

项目中实际遇到的情况

背景:优化某个sql的查询性能

版本:mysql 5.7

通过查询计划可以看到之前的查询好几张表都是全扫了一遍,小表还无所谓,最后一行的eo却是一张大表,更灾难的是,相同的逻辑还要 union all 一次,因为有 eo 历史表

eo数据量150万,eo历史表数据量560万

原先的eo子查询这么写的

用shift id关联,恰好where子句中要过滤 shift date,这里hard code 过滤条件只是测试使用,生产环境为变量

于是eo子查询可以再关联一次shift,并加上过滤条件

再次查看执行计划,发现eo用上了索引

查询提速明显

之前查询耗时

 

优化 eo子查询后

写在最后,以上子查询去重性能优化的方法适用范围有限,仅提供一种思路供参考。

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值