[英]MySQL query optimization for large data set @ 400K rows +
我有这个查询,它的主要目的是创建一个视图
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 |
它在很小的数据集上做得很好,但是我的数据集超过40万行。 我该如何优化呢? 我确实意识到我需要在某些地方使用join来加快速度。
sqlfiddle: http ://sqlfiddle.com/#!2/d54afc/8
提前致谢!
如果我理解得更好,您想要每个区块当前的美元价格,因此
尝试这个:
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 USD。 但是我不知道你是否想要那样。 请添加您的预期结果
我的SQL小提琴
编辑以回答尼尔斯评论:
亲爱的,这是屏幕截图,但是我的查询花费了4毫秒而不是13毫秒
您需要做的是使用JOIN
对查询进行简单的修改。
这是查询:
SELECT block.id,min(block.timestamp)timestamp, historic.usd
FROM block
JOIN historic
ON block.timestamp <= historic.timestamp
GROUP BY id;
这是正常工作的SQL Fiddle 。
您可能会尝试在两个表中为字段timestamp
添加索引(在第一种情况下可能是复合键): http : //sqlfiddle.com/#!2/ed89c/1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.