4

我有一个 MySql 数据库。我有很多记录(大约4,000,000,000行),我想处理它们以减少它们(减少到大约1,000,000,000行)。

假设我有以下表格:

  • RawData:我每秒有超过 5000 行我想将它们插入 RawData

  • ProcessedData:此表是在 RawData 中插入的行的已处理(聚合)存储。 最小行数 > 20,000,000

  • ProcessedDataDetail:我写了表 ProcessedData 的详细信息(聚合的数据)

    用户希望在需要连接8个以上其他表的ProcessedData表中查看和搜索。插入 RawData 并在 ProcessedData 中搜索(ProcessedData INNER JOIN ProcessedDataDetail INNER JOIN ...)非常慢。我使用了很多索引。假设我的数据长度是 1G,但我的索引长度是 4G :)。(我想利用这些索引,它们使我的过程变慢)

我怎样才能提高这个过程的速度?

我想我需要一个来自ProcessedData的影子表,将其命名为ProcessedDataShadow。然后处理 RawData 并将它们与ProcessedDataShadow聚合,然后将结果插入ProcessedDataShadowProcessedData。你有什么想法??

(我正在用 C++ 开发项目)

先感谢您。

4

2 回答 2

3

在不了解您的实际应用程序的情况下,我有以下建议:

  1. 如果您还没有,请使用 InnoDB。InnoDB 利用行锁并且在处理并发更新/插入方面要好得多。如果您不同时工作,它会更慢,但行锁定可能是您必须拥有的,这取决于您将拥有多少原始数据源。

  2. 索引通常会加快速度,但选择不当的索引会使事情变慢。我不认为你想摆脱它们,但是很多索引会使插入变得非常慢。可以在插入批量数据时禁用索引,以防止在每次插入时更新索引。

  3. 如果您将选择可能会干扰数据收集的大量数据,请考虑使用仅用于读取的复制从数据库服务器。即使这会锁定行/表,主(主)数据库也不会受到影响,并且从属数据库一旦空闲就会恢复速度。

  4. 您需要处理数据库中的数据吗?如果可能,可能会收集应用程序中的所有数据并仅插入 ProcessedData。

于 2011-06-14T08:14:04.773 回答
2

你没有说数据的结构是什么,它是如何合并的,数据需要多快地提供给用户,也没有说合并过程有多混乱。

然而,最直接的问题将是每秒下沉 5000 行。您将需要一台非常大、非常快的机器(可能是一个分片集群)。

如果可能的话,我建议编写一个合并缓冲区(使用内存中的哈希表 - 不在 DBMS 中)以将合并的数据放入 - 即使它只是部分合并 - 然后从它更新到处理的数据表中,而不是尝试直接从 rawData 填充它。

实际上,我可能会考虑将原始数据和合并数据分离到单独的服务器/集群上(MySQL 联合引擎可以方便地提供数据的统一视图)。

您是否分析了查询以查看您真正需要哪些索引?(提示 -这个脚本对此非常有用)。

于 2011-06-14T08:46:54.473 回答