Mysql InnoDB 合并/复制数据

标签 mysql innodb

我有一个场景,我需要进行相对大量的插入。 假设我每分钟有数百万行...这些行被插入到结构相同的表中,但对数据应用了不同级别的聚合。

此外,为了再次访问这些数据,它的索引非常多。

现在,为了尽快完成插入,为其他处理腾出时间,我想到插入一个具有完全相同结构但没有索引的“DUMP”表...然后运行某种“合并过程”,它将数据 ETL 到索引聚合表中......认为由于这一切都发生在数据库内部,因此应该比从外部多次推送它更快。

但是,一个简单的“insert into tableB select * from tableA”很容易超出我的 innodb_buffer_pool 的行锁,然后出现错误 1026es。

最后,问题是:是否有一种快速/可靠的方法将大量数据从一个表移动/合并到另一个表?
这些表可以而且很可能会被分区。我想您可以简单地将分区从一个表移动到另一个表,这是一厢情愿的想法。
如果是“从插入中选择”,那么我想从应用程序端将其全部插入会更安全、更容易。

最佳答案

您当然可以插入中间表,然后传输行。不过,这最终可能会给数据库带来更多工作。

如果您想将数据从一个表复制到另一个表,INSERT ... SELECT 肯定是您的 friend ,它肯定比通过客户端移动数据更快。

每分钟 1M 行是相当多的插入,您当然需要仔细构建您的应用程序。我假设您已经大批量执行这些操作(10,000 行似乎通常是正确的),但您还想注意 innodb 的持久性级别(即刷新时)。

关闭 MySQL 的 binlog 会大大减少 fsync 的数量(即在某些情况下减少 50%),因此建议在高提交工作负载中使用。您可能还想查看第三方所做的各种调整工作。当然,使用插件而不是原来的innodb。

<小时/>

“腾出时间进行其他处理”,您是指在您的客户端还是数据库上?如果是您的客户,您绝对应该与其他工作异步插入 - 将记录保存在内存或光盘上(但要注意此存储的持久性),直到您有时间插入它们,大批量插入它们。 p>

关于Mysql InnoDB 合并/复制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4106446/

相关文章:

mysql - 在 MySQL 中检查时间戳是否来自今天

mysql - RDS MySQL 高内存消耗

java - Mysql select ...更新死锁

mysql - Innodb 插入速度非常慢 : 65secs for 1K entries in empty table

php - Laravel 从 ManyToOne 关系错误 SQLSTATE [23000] 创建 Eloquent 实例

java - JDBC VS Hibernate

java - 简单键/值数据库的最佳存储引擎

MySQL未知表引擎innodb

MySQL 查询给出错误的结果

mysql - 如何使用 REGEXP MySQL 函数查找超过 2 个点的电子邮件?