处理大量数据的批量插入

时间:2013-03-16 17:05:35

标签: mysql database performance bulkinsert database-performance

我在csv文件中有一些数据。数据量巨大(约65GB)。我想将它们全部插入到数据库中,以便以后可以查询它们。

csv文件本身很简单,它只有5列。所以基本上所有数据都将插入到一个表中。

现在我已经尝试将这些数据插入到mysql数据库中,但它所花费的时间非常庞大。我花了近6个小时才插入了1.3GB的数据(我的处理器是核心i5 2.9 GHz,RAM是4GB DDR3)。

此加载需要很快完成,以便所有数据插入都应在4/5天内完成。

在这种情况下哪个数据库会显示最佳性能,前提是数据可以接受合理的查询速度?

此外,我还应该遵循其他一些步骤/做法吗?

1 个答案:

答案 0 :(得分:1)

您可能甚至不需要导入它。您可以使用engine = CSV创建表。

mysql> create table mycsv(id int not null) engine=csv;
Query OK, 0 rows affected (0.02 sec)

然后进入您的数据目录并删除mycsv.CSV并将您的CSV文件移动/复制/符号链接为mycsv.CSV。回到mysql并输入flush tables;,你就可以了。 (注意:它可能不适用于\r\n,因此您可能需要先将其转换为\n

如果您正在使用InnoDB,问题是它必须跟踪插入的每一行的每个撤消日志条目,这需要大量资源,耗费时间。最好以较小的批次执行,以便它可以在内存中执行大部分撤消日志跟踪。如果您在加载过程中按ctrl-c并且需要回滚,则会出现撤消日志。在加载该批次之后,它不再需要跟踪它。如果你一次完成所有操作,那么它必须跟踪所有这些撤销日志条目,可能不得不转到磁盘 - 这是一个杀手。

如果我知道我不打算进行行级锁定,我更喜欢使用myisam进行数据锁定,就好像我想运行一个长程序来分析数据一样。该表已被锁定,但我只需要运行一个程序。此外,您始终可以使用合并表 - 它们采用myisam表,您可以将它们组合到一个表中。我喜欢这样做的日志文件,其中每个表是一个月的数据。然后我有一年的合并表。合并表不会复制数据,只是指向每个myisam表。