我在php中有一个数组,通过XML填充。这个数组大约有21000个项目。
我正在循环遍历数组,检查数据库中是否存在名称节点(mysql),如果它确实更新了它,否则插入新数据并存储插入/更新行的行ID,然后我在同一个数据库中循环将更多数据插入另一个表并将其链接到第一个表: http://pastebin.com/iiyjkkuy
数组如下所示:http://pastebin.com/xcnHxeLk
现在由于阵列中的大量节点(21000),这超过了我的开发系统上300秒(5分钟)的最大执行时间..
循环此大小数组并插入数据的最佳方法是什么?
关于此的更多信息。我正在使用表达式引擎1.8.6(工作原因),我必须使用其内置的数据库类。
每次插入/更新之前的select语句的原因是为将来的语句获取行ID。数据必须以某种方式在DB中构建,例如:
每个源节点都有一个papergroup节点 - 这需要先插入/更新 然后每个纸张名称节点需要链接到同一个表格中的纸张组 然后将sourceid等插入到源表中,其中包含指向tables表中父文件的链接,因此基本的db模式是这样的: 纸组插入纸张表 纸张名称插入纸张表格中.PID作为papger group papers.ID的链接 源被插入到源表中并链接到source.paperID
上的论文表填充数组的XML源的基本结构如下:
<sources>
<source>
<sourceid>1</sourceid>
<papername>test</papername>
<papergroup>test group</papergroup>
<papertype>Standard</papertype>
<sourcename> test source</sourcename>
<sourcesize>page</sourcesize>
</source>
</sources>
以上不是完整的细分,但它显示了在一个部分中发送的所有信息的要点。希望这会有所帮助。
好的,我设法得到一些时间。需要1:35:731才能获取XML,然后在0:0:025和0:0:700之间进行数组循环(选择,插入/更新)
答案 0 :(得分:3)
每次插入记录都是数据库的另一次往返。
我想知道如果你可以将这些SQL命令分批到一次往返并一次执行它们,你的生活会更好吗?你可以通过这种方式减少网络延迟。
了解如何优化任何事情的最佳方法是获得一些关于花费时间的硬数据。找出花费最多时间,改变它并重新测量的东西。重复练习,直到你获得可接受的表现。
我没有看到您的任何数据。你只是猜测,所有在这里回答的人(包括我)也是如此。
答案 1 :(得分:2)
我会把它写成算法。
Store the first array inside of a new variable. $xmlArray;
SELECT the table to compare against from the databse and store it in a variable. $tableArray
foreach through $xmlArray and compare against $tableArray
Save the needed updates into a new array, $diffArray;
Prepare a statement using PDO prepare() and bindParam()
foreach through $diffArray, change the parameters only and execute()
这应该是最有效的方式来做你需要的。
答案 2 :(得分:0)
我想最简单的方法之一是创建批量数组,用于插入大约1500条记录并进行批量插入。我尝试使用2k插入while循环和单插入然后花了27秒插入2000条记录但是只需一个插入批处理它只需要.7秒......