最近做点股市分析,发现日线数据已经达到了千万级,想做个两个日期之间的收盘价比较,例如第一周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秒就完成了。