2010-11-05 54 views
0

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

此外,为了再次访问这些数据,它的索引很大。

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

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

因此,最后要回答的问题是:是否有快速/可靠的方式将大量数据从一个表移动到另一个表?
表格可以也可能会被分区。我猜想你可以简单地将一个分区从一个表移动到另一个表。
如果“从插入选择”是,那么我想它会更安全,更容易插入所有从应用程序端。

回答

1

您当然可以插入到中间表中,然后传输行。尽管如此,这可能最终会为数据库带来更多的工作。

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

每分钟1M行是相当多的插入,你一定要仔细构建你的应用程序。我认为你已经在大批量生产这些产品了(10,000行似乎总体上是正确的),但是你也想要注意innodb的耐久性水平(即冲洗时)。

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


要“释放其他处理时间”,您的意思是在您的客户端或您的数据库?如果它是你的客户,那么你一定要与其他工作异步插入 - 将记录保存在内存或光盘上(但要注意这家商店的耐用性),直到你有时间插入它们,并将它们大批插入。