Mysql InnoDB合并/复制数据

时间:2010-11-05 13:51:36

标签: mysql innodb

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

此外,为了再次访问此数据,其索引相当严重。

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

但是,一个简单的“插入tableB select * from tableA”很容易超过我的innodb_buffer_pool并带有行锁,然后错误1026我。

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

1 个答案:

答案 0 :(得分:1)

您当然可以插入中间表,然后传输行。这可能最终只会为数据库做更多工作。

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

每分钟1M行是非常多的插入,你肯定需要仔细构建你的应用程序。我假设你已经批量做这些(10,000行看起来一般都是正确的),但你也要注意innodb的耐久性等级(即冲洗时)。

关闭MySQL的binlog会减少fsyncs的数量(在某些情况下为50%),因此建议用于非常高的提交工作负载。您可能还想查看第三方完成的各种调整工作。当然,使用插件而不是原始的innodb。


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