我有这个查询,其主要目的是创建一个视图
SELECT block.id,min(block.timestamp)timestamp, historic.usd
FROM block, historic
WHERE block.timestamp <= historic.timestamp
GROUP BY id;
查询这些表
block
表:
| ID | timestamp |
| 0 | 2013-08-22 00:38:05 |
| 1 | 2013-08-22 00:37:53 |
historic
表:
| timestamp | USD |
| 2013-08-22 00:37:53 | 800 |
| 2013-08-22 00:38:30 | 799 |
| 2013-08-22 00:40:53 | 789 |
它可以很好地处理非常小的数据集,但我的数据集超过了400k行。我该如何优化它?我确实意识到我需要使用join来加速它。
sqlfiddle:http://sqlfiddle.com/#!2/d54afc/8
提前致谢!
答案 0 :(得分:0)
如果我理解得更好,你想要每块都有当前的美元价格,所以
试试这个:
SELECT b.*,
(SELECT h.usd
FROM historic h
WHERE h.timestamp <= b.timestamp
AND NOT EXISTS
(SELECT 'NEXT' FROM historic h2
where h2.timestamp > h.timestamp
and h2.timestamp <= b.timestamp)
)
FROM block b
此查询将返回您的数据集,始终为800美元。但我不知道你是否想要那个。请添加您的期望结果
编辑回答Neels评论:
亲爱的,这是截图,但我的查询时间为4毫秒而不是13毫秒
答案 1 :(得分:0)
您需要做的是使用JOIN
对查询进行简单修改。
以下是查询:
SELECT block.id,min(block.timestamp)timestamp, historic.usd
FROM block
JOIN historic
ON block.timestamp <= historic.timestamp
GROUP BY id;
这是工作SQL Fiddle。
答案 2 :(得分:0)
您可能会尝试在两个表中添加字段timestamp
的索引(可能是第一种情况下的复合键):http://sqlfiddle.com/#!2/ed89c/1