sql连表优化心得
慢查询的sql:
select
`a` .*,
`b`.`zgzdf_date` as `max_rate_date`
from
(
select
`stockcode`,
`stockname`,
`shareholder_name`,
max(zgzdf) as max_rate
from
`shareholder_battle_fund`
where
`shareholder_name` = '香港中央结算有限公司'
and `stocktype` = 1
group by
`stockcode`
) as a
inner join `shareholder_battle_fund` as `b` on
`a`.`stockcode` = `b`.`stockcode`
and `a`.`max_rate` = `b`.`zgzdf`
and `b`.`shareholder_name` = `a`.`shareholder_name`
order by
`max_rate` desc
limit 20 OFFSET 10
这条sql的本意是:按股票代码分组,取最大的涨跌幅,并将最大涨跌幅所在的日期一并取出,然后按涨跌幅排序进行分页。
优化思路就一条,缩减join表的大小:
优化后的sql:
select
*
from
(
select
`a` .*,
`b`.`zgzdf_date` as `max_rate_date`
from
(
select
`stockcode`,
`stockname`,
`shareholder_name`,
max(zgzdf) as max_rate
from
`shareholder_battle_fund`
where
`shareholder_name` = '香港中央结算有限公司'
and `stocktype` = 1
group by
`stockcode`
order by
`max_rate` desc
limit 20 OFFSET 10
) as a
inner join `shareholder_battle_fund` as `b` on
`a`.`stockcode` = `b`.`stockcode`
and `a`.`max_rate` = `b`.`zgzdf`
where
`b`.`shareholder_name` = '香港中央结算有限公司') as c
order by
`c`.`max_rate` desc
优化后的sql中,a表被缩减至20条数据,b表被where条件缩减掉一批数据。执行耗时由原来的2200毫秒,缩减至149毫秒。
本作品采用《CC 协议》,转载必须注明作者和本文链接
666
我最近也遇到这种,老系统上来就是left join ,还有分组排序好多,慢的一批
但是limit 了 结果还准确吗
你这个情况,应该能免去外层
JOIN
?前提条件:zgzdf
能转换成[-2 ^ 31, 2 ^ 31)
zgzdf_date
是 32 位整数时间戳大致是这样?
程序拿到数据后,高 32 位是转换后的涨跌幅(转回来就好),低 32 位是日期。
连表开销,应该远大于这点运算量吧。。
第一个a表全表查询了吧
扔到chatgpt,让它帮你优化 :smile:
修改后,子查询的范围缩小了,提早进行选择where查询! :+1: