Mysql-SQL优化-⼦查询替代LEFTJOIN
表A:批次信息表,
表B:实际批次明细表,
Mysql版本:5.6.36
两表之间的数据体量差异:表B是表A的10000倍。
经过结转,表B通常保留 1千5百万数据。表A就是1千多条数据。
计算近24⼩时时段,24个批次中最⼤的⼀批。由于指标量是每天随时间推移⽽变⼤,因此需要取每个⼩时最后⼀批,即是该时段最终指标。减去上⼀⼩时指标量即为当前时段内的指标考核量。
原SQL逻辑是先⽤两个表A左连接,连接时将批次时间的Hour + 1使批次正好错⼀个⼩时。得到当前时段与上⼀时段的批次。
再与表B关联,得到两个24批的实际明细,此处将⼤表表B,关联了两次,前⾯描述,表B数据量在1500万。导致最终查询时间在50S左右。
修改后的⽅式:
使⽤⼦查询,先出第⼀个24⼩时时段的明细数据,⼤概在3万左右数据。再⽤第⼆个⼦查询出时段错1个⼩时的25批明细数据。最后将两个⼦查询使⽤ hour + 1的⽅式进⾏left join。由于⼦查询提前过滤了数据量,最终查询相应时间缩短⾄ 700ms左右。超出预期。达到优化⽬的。
当然,此处不是即席查询应⽤,⽽是离线worker,700ms 相⽐较于 50S提升当然是⾮常可观的,对于⽀持实时相应的查询,200ms以上的可能都要考虑其他⽅式进⾏优化了。
sql left join 多表连接由于涉及数据保密,此处不对具体分析过程进⾏拆解,仅是思路。在⼤表关联时尽可能提前缩⼩数据扫描范围,有时候⼦查询并不⼀定总是降低效率,这点在HIVE-SQL中体现尤为明显。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论