MySQL 大数量left join 太慢语句拆分的一种办法

最近做点股市分析,发现日线数据已经达到了千万级,想做个两个日期之间的收盘价比较,例如第一周1月3日和1月6日的涨幅,很简单的语句,如下:

select a.scode,'s.' name,a.sdate sdate1,a.close close1,
b.sdate sdate2 , b.close close2,
case when ifnull(a.close,0)>0 then  b.close/a.close else 0 end 涨幅 
from (select *  from t_bar1 where  sdate='2023-01-03') a  
left join (select *  from  t_bar1 where sdate='2023-01-06') b on a.scode = b.scode    

t_bar1 对 sCode(股票代码)、sDate(交易日期)都做了索引,语句解释看上去很理想。但运行起来十分慢,运行10多分钟还不出结果。
语句解释

再检查子查询,速度十分快,几毫秒的事情。

(select *  from t_bar1 where  sdate='2023-01-03')
(select *  from  t_bar1 where sdate='2023-01-06') 

百思不得其解,不知道有没有大神可以解释一下?

后来用了取巧的方式,拆分为多个语句如下:

drop table IF EXISTS temp_bar1;

create  table  temp_bar1 AS 
select scode,sdate sdate1 , close close1 from t_bar1 
where sdate='2023-01-03';

ALTER TABLE temp_bar1 
 ADD INDEX scode(scode);

drop table if EXISTS temp_bar2;

create  table  temp_bar2 AS 
select scode,sdate sdate2 , close close2 from t_bar1 
where sdate='2023-12-22';

ALTER TABLE temp_bar2
 ADD INDEX scode(scode) ;

select a.scode,s.name,a.sdate1,a.close1,
b.sdate2 , b.close2,
case when ifnull(a.close1,0)>0 then  b.close2/a.close1 else 0 end 涨幅 
from temp_bar1  a  
left join  temp_bar2  b on a.scode = b.scode   ;

如此办法,运行居然取得了意想不到的效果,不到1秒就完成了。

你可能感兴趣的:(mysql,sql,数据库,数据结构)