繁体   English   中英

针对40万行的大型数据集的MySQL查询优化+

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM