Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对大数据集@400K行的MySQL查询优化+_Mysql_Sql - Fatal编程技术网

针对大数据集@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;