【发布时间】:2019-05-14 08:54:43
【问题描述】:
我在 SQL 中有一个视图,它使用了一个连接,并且花费的时间比我希望的要长得多。我认为如果我将其转换为子查询,它会运行得更快,但我遇到了麻烦。
基本上,我想创建一个“目标”列来计算资产价格的 24 小时百分比变化。现在,我的方法是创建第一个视图,它是普通表,然后创建第二个视图,它是第一个表的副本,但带有 date+1,然后我可以使用它来计算 24 小时目标。下面是我的sql代码。我在 MySQL 工作。
create view PricesView1 as
select Date,Symbol, avg(Price) as 'Price', avg(BTC_Dominance) as 'BTC_Dominance',
pkdummy,pkey from Prices group by Date,pkdummy,pkey, Symbol
having right(pkdummy,2)=22 and Date > '2018-11-22';
create view PricesView2 as
select sq.Date, sq.oldDate, sq.Symbol, sq.Price, newP.Price as 'NewPrice',
newP.BTC_Dominance as 'NewBTCdominance', newP.pkdummy from (
select date_add(Date, INTERVAL 1 DAY) as 'Date', Date as 'oldDate',Symbol,avg(Price) as 'Price',
avg(BTC_Dominance) as 'BTC_Dominance', pkdummy,pkey from Prices
group by Date,date_add(Date, INTERVAL 1 DAY),pkdummy,pkey, Symbol having right(pkdummy,2)=22)sq
join Prices newP on newP.Date=sq.Date and newP.Symbol=sq.Symbol
where right(newP.pkdummy,2)=22 and sq.Date > '2018-11-22' order by datetime desc;
#Use other two views to calculate target
create view priceTarget as
select pv1.Date, pv1.Symbol, avg(pv1.Price) as 'Initial Price', avg(pv2.NewPrice) as 'Price24hLater',
avg(((pv2.NewPrice-pv1.Price)/pv1.Price)*100) as 'Target24hChange',
avg(((pv2.NewBTCdominance-pv1.BTC_Dominance)/pv1.BTC_Dominance)*100) as 'BTCdominance24hChange',
pv1.pkey from PricesView1 pv1
join PricesView2 pv2 on pv1.Date=pv2.oldDate and pv1.Symbol=pv2.Symbol
group by pv1.Date, pv1.Symbol;
关于如何通过更快的查询避免使用连接来获得相同的结果有什么想法吗?
任何帮助将不胜感激!
编辑:我想这只是因为我只是加载了很多数据。我创建了一个新的第一个视图来提前过滤我的数据,并将加载时间从大约 32 秒减少到 10 秒多一点。感谢那些帮助过的人!
【问题讨论】:
-
一种肯定会加快速度的方法是不使用视图,它对 MySQL 中底层索引的访问非常有限,因此几乎没有用。
-
我很想从中创建一个查询而不是使用视图,但我不太擅长 SQL,这帮助我使逻辑比一个非常大的单个查询简单得多,这当然会是更好的解决方案。我还听说过使用索引以及如何使查询更快,但我又不是很擅长 SQL,也不知道如何使用它们。
标签: mysql sql join subquery mysql-workbench