我们为我们的网站建立了离线计划的链接。在我们的离线计划中,我们有50,000条记录要推送到我们的网站。我们现在做的是:
在离线程序中,我们构建了一个包含1500条记录的xml文件,并将其发布到我们网络服务器上的php文件中。在网络服务器上,我们读取xml并将其推送到mysql数据库,在我们这样做之前,我们首先检查记录是否已经存在,然后我们更新记录或将其作为新记录插入。
完成后,我们会向离线程序返回一条消息,表示批次已完成。脱机程序使用接下来的1500条记录构建一个新的xml文件。这个过程一直重复,直到达到最后1500条记录。
问题是,在将记录推送到数据库时,Web服务器变得非常慢。可能那是因为我们首先检查已经存在的记录(这是一个查询),然后将其写入数据库(这是第二个查询)。因此,对于每个批次,我们必须运行3000个查询。
我希望你们有一些提示来加快这个过程。
提前致谢!
答案 0 :(得分:2)
导入大量数据没有问题,我有很多经验。
答案 1 :(得分:1)
要做的好事是编写一个单独的查询,该查询由分号分隔的所有insert语句的串联组成:
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但是根据您的服务器配置,每个语句的数据量以及插入次数与更新次数,您必须对其进行微调。< / p>
答案 2 :(得分:0)
阅读有关Mysql唯一索引约束的一些信息。这应该有所帮助:
答案 3 :(得分:0)
我在4个月前遇到了同样的问题,我在java而不是php中获得了更多的性能编码,并避免使用xml文档。 我的提示:你可以阅读整个表格(如果你这样做一次比1次多次查询更快)并将这个表保存在内存中(例如在HashMap中)。在插入记录之前,您可以检查它是否存在于您的结构中(您不会打扰数据库)。 你可以通过这种方式提高你的表现。