【问题标题】:How to manage Huge operations on MySql如何管理 MySql 上的巨大操作
【发布时间】:2011-06-14 07:05:21
【问题描述】:

我有一个 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 聚合,然后将结果插入 ProcessedDataShadowProcessedData。你有什么想法?

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

提前谢谢你。

【问题讨论】:

    标签: mysql database mysql-management database-optimization


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 非常感谢。但我在插入时遇到了 InnoDB 问题。为什么它插入记录很慢?
    • InnoDB 插入比 MyISAM 慢得多,因为它支持并发。但是,当比较插入到一个表中时,一次有 10 个同时连接,InnoDB 可能会更快或至少同样快,所以这完全取决于应用程序。您可以通过同时插入多行来加快这个过程(意思是多个 VALUES 括号)
    【解决方案2】:

    您还没有说数据的结构是什么、如何合并、用户需要多快地获得数据,以及合并过程可能有多混乱。

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

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

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

    您是否分析过查询以了解您真正需要哪些索引? (提示 - this script 对此非常有用)。

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 2013-12-16
      • 1970-01-01
      • 2011-09-20
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2013-05-18
      • 1970-01-01
      相关资源
      最近更新 更多