0

我们为我们的离线程序建立一个链接到我们的网站。在我们的离线程序中,我们有 50.000 条记录要推送到我们的网站。我们现在要做的是:

在离线程序中,我们构建了一个包含 1500 条记录的 xml 文件,并将其发布到我们网络服务器上的 php 文件中。在网络服务器上,我们读取 xml 并将其推送到 mysql 数据库,在我们这样做之前,我们首先检查记录是否已经存在,然后我们更新记录或将其作为新记录插入。

完成后,我们向我们的离线程序返回一个批处理完成的消息。离线程序使用接下来的 1500 条记录构建一个新的 xml 文件。重复此过程,直到达到最后 1500 条记录。

问题是网络服务器在将记录推送到数据库时变得非常慢。可能那是因为我们首先检查已经存在的记录(这是一个查询),然后将其写入数据库(这是第二个查询)。因此,对于每个批次,我们必须运行 3000 个查询。

我希望你们有一些技巧来加快这个过程。

提前致谢!

4

4 回答 4

2
  1. 在开始导入之前,请阅读您拥有的所有数据 ID,不要对每个插入的项目进行检查查询,而是在现有的 php 数组中检查它。
  2. 修复数据库表上的键。
  3. 在一个请求上进行所有插入,或使用事务。

以这种方式导入大量数据没有问题,我有很多经验。

于 2012-09-21T11:01:09.530 回答
1

一件好事是编写一个由分号分隔的所有插入语句的串联组成的单个查询:

INSERT INTO table_name
        (a,b,c)
    VALUES
        (1,2,3)
    ON DUPLICATE KEY
        UPDATE a = 1, b = 2, c = 3;
INSERT INTO table_name
    ...

您可以连接 100-500 个插入语句并将它们包装在一个事务中。

将许多语句包装到一个事务中会有所帮助,因为它不会在插入每一行后立即将数据提交到磁盘,它将整个 100-500 个批处理保存在内存中,当它们全部完成时,它会将它们全部写入磁盘 -这意味着更少的间歇性磁盘 IO。

您需要找到一个合适的批量大小,我举例说明了 100-500,但取决于您的服务器配置、每条语句的数据量以及插入与更新的数量,您必须对其进行微调。

于 2012-09-21T11:13:39.830 回答
0

阅读有关 Mysql 唯一索引约束的一些信息。这应该有助于:

Mysql 索引教程

于 2012-09-21T10:57:58.113 回答
0

4 个月前我遇到了同样的问题,我在 java 而不是 php 中获得了更多的性能编码,并且避免了 xml 文档。我的提示:您可以读取整个表(如果您执行一次比逐个进行多次查询要快)并将此表保存在内存中(例如在 HashMap 中)。在插入记录之前,您可以检查它是否存在于您的本地结构中(您不必打扰数据库)。你可以通过这种方式提高你的表现。

于 2012-09-21T11:03:20.327 回答