23

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

4

1 回答 1

47

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

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 行。而是将其分解成更小的尺寸。

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

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

于 2013-10-30T12:40:09.030 回答