我有一个MySql数据库。我有很多记录(大约 4,000,000,000 行),我想处理它们以减少它们(减少到 1,000,000,000 行)。
假设我有以下表格:
表 RawData :我每秒要超过5000行,我想将它们插入RawData
表 ProcessedData :此表是在RawData中插入的行的已处理(聚合)存储。 最小行数> 20000000
表 ProcessedDataDetail :我写了表ProcessedData的详细信息(聚合的数据)
用户希望在 ProcessedData 表中查看和搜索需要加入 8 其他表格的表格。 插入RawData并在ProcessedData中搜索(ProcessedData INNER JOIN ProcessedDataDetail INNER JOIN ...)非常慢。我使用了很多索引。假设我的数据长度是1G,但我的索引长度是4G :)。 (我希望得到这些索引,它们使我的过程变得缓慢)
如何提高此流程的速度?
我想我需要来自 ProcessedData 的影子表,将其命名为 ProcessedDataShadow 。然后处理RawData并将它们与 ProcessedDataShadow 聚合,然后将结果插入 ProcessedDataShadow 和 ProcessedData 。你的想法是什么?
(我正在用C ++开发项目)
提前谢谢。
答案 0 :(得分:3)
在不了解您的实际应用程序的情况下,我有以下建议:
如果您还没有使用InnoDB。 InnoDB使用行锁,在处理并发更新/插入方面要好得多。如果不同时工作会慢一些,但行锁定可能是你必须拥有的,具体取决于你对RawData有多少来源。
索引通常会加快速度,但选择错误的索引会使速度变慢。我不认为你想摆脱它们,但很多索引可以使插入非常慢。插入批量数据时可以禁用索引,以防止更新每个插入的索引。
如果要选择可能会干扰数据收集的大量数据,请考虑使用仅用于读取的复制从属数据库服务器。即使这会锁定行/表,主(主)数据库也不会受到影响,并且奴隶会在可以自由地恢复速度。
您是否需要处理数据库中的数据?如果可能,可以收集应用程序中的所有数据,并仅插入ProcessedData。
答案 1 :(得分:2)
您没有说明数据的结构是什么,如何整合数据,如何及时向用户提供数据,以及合并过程可能是多么糟糕。
然而,最直接的问题是每秒下沉5000行。你需要一台非常大,速度非常快的机器(可能是一个分片集群)。
如果可能,我建议编写一个合并缓冲区(使用内存中的哈希表 - 不在DBMS中)将合并数据放入 - 即使它只是部分合并 - 然后从此更新到processedData表而不是而不是试图直接从rawData填充它。
实际上,我可能会考虑将原始数据和合并数据分离到单独的服务器/集群上(MySQL联合引擎可以方便地提供统一的数据视图)。
您是否分析过您的查询以查看您确实需要哪些索引? (提示 - this script对此非常有用)。