我有成千上万的数据通过巨大的XML解析,可以使用PHP和MysqL插入数据库表中.我的问题是将所有数据插入表中花费的时间太长.有没有一种方法可以将我的数据分成较小的组,以便按组进行插入过程?例如,如何设置一个脚本来处理100个数据?这是我的代码:
@H_502_6@foreach($itemList as $key => $item){ $download_records = new DownloadRecords(); //check first if the content exists if(!$download_records->selectRecordsFromCondition("WHERE Guid=".$guid."")){ /* do an insert here */ } else { /*do an update */ }
}
*注:$itemList约为62,000,并且仍在增长.
最佳答案
使用for循环?
但是将数据加载到MysqL的最快选择是使用LOAD DATA INFILE命令,您可以创建文件以通过PHP加载,然后通过其他过程(或作为原始过程的最后一步)将其提供给MysqL.
如果无法使用文件,请使用以下语法:
@H_502_6@insert into table(col1,col2) VALUES (val1,val2),(val3,val4),(val5,val6)
因此,您可以减少运行的句子总数.
编辑:给出您的摘录,似乎您可以从MysqL的INSERT … ON DUPLICATE KEY UPDATE语法中受益,让数据库完成工作并减少查询量.假设您的表具有主键或唯一索引.
要每100行访问一次数据库,您可以执行以下操作(请对其进行检查并修复为您的环境)
@H_502_6@$insertOrUpdateStatement1 = "INSERT INTO table (col1,col2) VALUES "; $insertOrUpdateStatement2 = "ON DUPLICATE KEY UPDATE "; $counter = 0; $queries = array(); foreach($itemList as $key => $item){ $val1 = escape($item->col1); //escape is a function that will make //the input safe from sql injection. //Depends on how are you accessing the DB $val2 = escape($item->col2); $queries[] = $insertOrUpdateStatement1. "('$val1','$val2')".$insertOrUpdateStatement2. "col1 = '$val1',col2 = '$val2'"; $counter++; if ($counter % 100 == 0) { executeQueries($queries); $queries = array(); $counter = 0; } }
然后executeQueries将获取该数组并发送一个多个查询:
@H_502_6@function executeQueries($queries) { $data = ""; foreach ($queries as $query) { $data.=$query.";\n"; } executeQuery($data); }