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 协议》,转载必须注明作者和本文链接
推荐文章: