【问题标题】:How can mysql insert millions records faster? [closed]mysql如何更快地插入数百万条记录? [关闭]
【发布时间】:2013-11-10 00:51:59
【问题描述】:

我想在我的数据库中插入大约数百万条记录,但是速度非常慢,速度约为 40,000 条记录/小时,我不认为我的硬件太慢,因为我看到 diskio 低于 2 MiB/s。我有许多表分隔在不同的 .sql 文件中。单条记录也很简单,一条记录少于15列,一列少于30个字符。我在archlinux下使用mysql 5.3完成了这项工作。你们有什么想法吗?还是这个速度不慢?

【问题讨论】:

  • 您应该能够每分钟上传 40k 行。如何导入记录?
  • 瓶颈是什么?你是如何插入记录的?您能否以某种方式对此进行分析以确定哪个部分需要很长时间?
  • 您也可以使用准备好的语句——也就是说,如果您通过编程语言插入。
  • 实际上 ich 从 sqlite 数据库中转储了所有表并保存为 .sql 文件。我想使用以下命令将这些表导入 mysql-server:mysql -u user -p database table1(field1field2)值(“data1”,“data2”);插入table1field1field2)值(“data1”,“data2”); ......(百万行)

标签: mysql insert records


【解决方案1】:

这很可能是因为您要插入这样的记录:

INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");
INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2");

每次需要INSERT 时发送一个新查询对性能不利。而是将这些查询组合成一个查询,如下所示。

INSERT INTO `table1` (`field1`, `field2`) VALUES ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2"),
                                                 ("data1", "data2");

您还可以在MySQL Docs 中阅读有关插入速度的更多信息。它清楚地描述了以下内容。

要优化插入速度,请将许多小操作组合成一个大操作。理想情况下,您建立一个连接,一次发送许多新行的数据,并将所有索引更新和一致性检查延迟到最后。

当然,如果数量很大,请不要将它们全部组合在一起。假设您需要插入 1000 行,然后不要一次插入一个。但是您可能不应该同样尝试在单个查询中包含所有 1000 行。而是将其分成更小的尺寸。

如果它仍然很慢,那可能只是因为你的服务器很慢。

请注意,您当然不需要组合查询中的所有这些空格,这只是为了更好地了解答案。

【讨论】:

  • 我尝试使用单个查询插入大约 50000 行,并得到 sql 查询太大的错误。
  • @Josef 然后在每次超过 x 行时创建一个新查询。
  • 这个答案真的很有帮助。一步一步的插入花了我将近 6 个小时来完成插入 150 万条记录,但是使用这种方法和每步 10000 条记录,我只花了大约 90 秒:D
  • 如果您能够从文本文件中导入数据,请使用 LOAD DATA INFILE。 MySQL 手册说这通常比使用 INSERT 语句快 20 倍。
  • 也许看起来合乎逻辑,但是如果插入的数据是外部的(用户、第三方公司)并且查询必须受到 sql 注入的保护?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多