mysql - 如何在 MySql 上管理 Huge 操作

标签 mysql database mysql-management database-optimization

我有一个 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++开发项目)

提前致谢。

最佳答案

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

  1. 如果您还没有使用 InnoDB,请使用它。 InnoDB 使用行锁并且更擅长处理并发更新/插入。如果您不同时工作,速度会变慢,但行锁定可能是您必须拥有的,具体取决于您将拥有多少原始数据源。

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

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

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

关于mysql - 如何在 MySql 上管理 Huge 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6340156/

相关文章:

sql - MySQL 数据库是否有等效的 Redgate SQL 比较?

php - 如何在 PHP 中将数据库 URL 显示为网页 URL

mysql - 计算分页后的记录数

database - 如何为基于 Web 服务的应用程序禁用 Rails 3 上的数据库

c# - 无法在 LINQ to SQL 中将类型 'string' 隐式转换为 'System.Data.Linq.Binary

php - 用户退出网站时的设置值

mysql - 如何使用条件连接搜索两个 MySql 表

mysql - 在sql中的表中搜索单词词典

php - 在 MySQL 中搜索返回的记录

mysql - 将 WordPress 从子域迁移到根域