【问题标题】:Handling bulk insert of huge data处理大量数据的批量插入
【发布时间】:2013-03-16 17:05:34
【问题描述】:

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

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

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

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

如果对数据的查询速度可以接受,那么在这种情况下,哪个数据库会显示出最佳性能?

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

【问题讨论】:

  • 你是如何插入数据的?每条记录一个插入语句或批处理方法;用一个插入语句插入多条记录?
  • @jurgenreza 我正在使用 LOAD DATA INFILE 语法以批处理方式插入数据
  • Mysql网站声称LOAD DATA INFILE比insert快20倍!这个链接有一些技巧,比如避免索引更新和一致性检查。如果您还没有,请查看:dev.mysql.com/doc/refman/5.5/en/insert-speed.html
  • 数据库是否在 SSD 上?如果没有,您可能想要一个,它应该会大大加快速度。

标签: mysql database performance bulkinsert database-performance


【解决方案1】:

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

mysql> 创建表 mycsv(id int not null) engine=csv; 查询正常,0 行受影响(0.02 秒)

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

如果您使用 InnoDB,问题是它必须跟踪插入的每一行的每个撤消日志条目,这需要大量资源,需要很长时间。最好以较小的批次进行,这样它就可以在内存中进行大部分撤消日志跟踪。撤消日志在那里,以防您在加载过程中按 ctrl-c 它需要回滚。加载该批次后,它不再需要跟踪它。如果您一次完成所有操作,那么它必须跟踪所有这些撤消日志条目,可能必须进入磁盘——这是一个杀手锏。

如果我知道我不打算进行行级锁定,我更喜欢使用 myisam 来处理数据,例如如果我想运行一个长程序来分析数据。该表已锁定,但我只需要在其上运行一个程序。另外,您始终可以使用合并表——它们采用 myisam 表,您可以将它们组合到一个表中。我喜欢对每个表都是一个月数据的日志文件执行此操作。然后我有一个合并表一年。合并表不复制数据,它只是指向每个 myisam 表。

【讨论】:

  • 在我的数据目录中找不到创建的表
  • 您确定您在正确的目录中吗?执行show variables like 'datadir' 时是否是同一个目录。您可能还想尝试执行flush tables 以确保将其写入磁盘。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 2015-09-29
  • 2016-04-19
  • 1970-01-01
  • 2012-02-06
相关资源
最近更新 更多