1

我有一个应用程序已经过时了,性能开始迅速下降。

  1. 我有一个包含 1 亿行的数据库表。
  2. 我需要在两个日期之间找到一组数据。
  3. 对该集合中的每一行应用一些算法。
  4. 将结果集(大约 1600 万行)插入到新表中。

如果你已经解决了这个问题,请你解释一下如何。

我可以使用任何需要的技术,nosql 或 sql。我不是在寻找哪种技术更好。我知道这可以通过许多不同的方式来完成。

我只是在寻找:

我已经使用 6 个 mongo 分片和 map reduce 为类似的数据集解决了这个问题,每台机器都有 32gb 内存。或者,我在 sql 中使用了分布式分区。我已经在一台具有 128gb 内存和 v 高 io 的机器上尽可能多地尝试和优化,但现在需要几个小时才能完成。

4

1 回答 1

0

根据您的描述,听起来您的数据已经适合单台机器,因此甚至可能不需要分片。您可以在日期时间列上创建聚集索引。此操作本身可能需要大量时间。一旦你有了它,选择你需要处理的 16 M 行应该会很快。

找到所需的 16M 行后,数据处理是否需要很长时间?您可能希望将原始的 16M 行(未经处理)插入到临时表中,然后创建可以帮助处理的附加索引。如果你能提供更多细节,我可以给你一些额外的建议。

如果数据库继续增长,传统的基于时间的分片也可能有效。您为每个月的数据创建一个新数据库,并在应用程序层确定需要查询和合并结果的数据库。这允许您通过简单地删除数据库而不是从现有表中选择性地删除大量数据来清除旧数据。后者可能会导致在实时系统上同时运行的其他查询出现性能问题。

于 2013-06-15T17:59:02.450 回答