MySQL查询优化大数据集@ 400K行+

时间:2014-03-11 07:56:18

标签: mysql sql

我有这个查询,其主要目的是创建一个视图

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

提前致谢!

3 个答案:

答案 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美元。但我不知道你是否想要那个。请添加您的期望结果

我的Sql Fiddle

编辑回答Neels评论:

亲爱的,这是截图,但我的查询时间为4毫秒而不是13毫秒enter image description here

答案 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