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

假设我有以下表格:

  • RawData :我每秒有 5000 多行我想将它们插入到 RawData
  • ProcessedData :此表是已处理(聚合)存储,用于存储在 RawData 中插入的行。
    最小行数 > 20,000,000
  • ProcessedDataDetail :我写表 ProcessedData 的详细信息(聚合的数据)

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

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

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

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

    先感谢您。

    最佳答案

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

  • 如果您还没有使用 InnoDB,请使用它。 InnoDB 使用行锁并且在处理并发更新/插入方面要好得多。如果您不同时工作,它会更慢,但行锁定可能是您必须拥有的,这取决于您将拥有多少 RawData 源。
  • 索引通常会加快速度,但选择不当的索引会使速度变慢。我不认为你想摆脱它们,但很多索引会使插入变得非常缓慢。可以在插入批量数据时禁用索引,以防止在每次插入时更新索引。
  • 如果您将选择可能会干扰数据收集的大量数据,请考虑使用仅用于读取的复制从数据库服务器。即使这会锁定行/表,主(主)数据库也不会受到影响,并且从属数据库会在空闲时尽快恢复速度。
  • 需要处理数据库中的数据吗?如果可能,可以收集应用程序中的所有数据,只插入 ProcessedData。
  • 关于mysql - 如何管理 MySql 上的巨大操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6340156/

    10-12 01:56