针对大数据集@400K行的MySQL查询优化+
我有这个查询,它的主要目的是创建一个视图针对大数据集@400K行的MySQL查询优化+,mysql,sql,Mysql,Sql,我有这个查询,它的主要目的是创建一个视图 SELECT block.id,min(block.timestamp)timestamp, historic.usd FROM block, historic WHERE block.timestamp <= historic.timestamp GROUP BY id; 历史表格: 它在非常小的数据集上做得很好,但我的数据集超过了400k行。我如何优化它?我确实意识到我需要使用“加入到某个地方”来加快速度 sqlfiddle: 提前谢谢
SELECT block.id,min(block.timestamp)timestamp, historic.usd
FROM block, historic
WHERE block.timestamp <= historic.timestamp
GROUP BY id;
历史表格:
它在非常小的数据集上做得很好,但我的数据集超过了400k行。我如何优化它?我确实意识到我需要使用“加入到某个地方”来加快速度
sqlfiddle:
提前谢谢 如果我理解得更好,您希望每个区块的当前美元价格,因此 试试这个:
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毫秒您需要做的是使用JOIN对查询进行简单修改 以下是查询:
SELECT block.id,min(block.timestamp)timestamp, historic.usd
FROM block
JOIN historic
ON block.timestamp <= historic.timestamp
GROUP BY id;
工作如下。您可以尝试为两个表中的字段时间戳添加索引,在第一种情况下可能是一个复合键:我不确定每个块id要获取什么?请添加预期结果查询没有意义。timestamp只返回块表中的时间戳,每个块id只有一个时间戳,因此不使用MIN函数。在本例中,您将获得的美元值是任何具有较新时间戳的历史记录中的随机美元…Galz是对的。我认为历史表也应该有block_id FK到block表历史表是我爬网的数据,我没有预先计算数据集以匹配其各自的block_id子查询需要更长的时间。不是吗?如果您将查询所用的时间与clinraus的查询进行比较,则可以看到差异。这里的Check只是尝试了一下,它确实比我之前的查询工作得更好。但是通过加入我的另一个查询来查询数据需要19分钟。我确实验证了我使用的另一组查询,只将块表与我使用的另一组查询连接起来,这花费了2毫秒。@clinraus:您尝试过在表上添加索引吗?历史表的主键是哪一个?这与问题中的原始陈述有何不同?您只是用显式联接替换了旧的过时的隐式联接,但联接仍然是一样的。@a-horse-with-no-name,我认为问题中的联接是交叉联接,而Neels所做的是内部联接,不是吗?我个人更喜欢联接语法,因为它可以更清楚地说明表是联接的,以及它们是如何联接的。如果查询是一个较大的查询,那么就很难理解要加入的内容以及要过滤的内容。然而,在这两种情况下,exec计划都是相同的,但如果查询结构更清晰,用户可以更好地了解优化。@Neels显式联接确实是更好的实践,更具可读性,但不会改善查询运行时间。。
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
SELECT block.id,min(block.timestamp)timestamp, historic.usd
FROM block
JOIN historic
ON block.timestamp <= historic.timestamp
GROUP BY id;