每三个月,我需要上传一个包含大约400,000个产品的CSV文件,然后将其插入MySQL数据库中。我觉得我的方法效率很高,并且想要一些建议。
目前,我像这样解析CSV文件:
public function parse_csv_to_array() {
// Initialize empty array
$array = $fields = array();
$interval = 0;
// File Handle
$handle = @fopen($this->csvFile, "r");
if ($handle) {
while (($row = fgetcsv($handle, 4096)) !== false) {
if (empty($fields)) {
$fields = $row;
continue;
}
foreach ($row as $k=>$value) {
$array[$interval][$fields[$k]] = $value;
}
$interval++;
}
if (!feof($handle)) {
echo "Error: unexpected fgets() failn";
}
fclose($handle);
}
return $array;
}
i然后,只需循环循环插入新的记录,如果已经存在新的记录。这意味着我要执行至少120万个SQL查询,以首先检查记录是否存在,然后插入/更换记录到数据库中。
当前,这是作为HTML5形式上传的,一旦单击提交,用户浏览器就会执行。整个过程最多可能需要30分钟,我认为这并不糟糕,但是我不得不将PHP脚本的超时设置为无限制以允许脚本运行。我觉得这很有效,并且可以大大增加服务器上的负载。我想知道是否有分割数组并在分区中上传记录的方法,或者我应该使用调度程序(例如Cron(。仅在一个脚本中执行120万个SQL查询的想法感觉很肮脏,必须有更好的方法。欢迎任何建议。
我认为使用块,而克隆将是最好的解决方案。每隔几分钟就运行CRON,以寻找新数据,并在给出数据库中上传到数据库。然后它可以在后台运行。
为了加快脚本本身,您也可以将您的条目和差异和插入作为批量插入。那么您就不必做这么多SQL统计。
您可以进行一个查询以带回所有记录,将记录存储在数组中,将CSV中的数据与数组中的值进行比较,并在必要时进行更新。您还可以创建一个数组,只有需要更新的值然后进行大量插入。
在这种方法中,您对数据库的请求没有那么多,因此,资源密集程度应该较低。