使用PHP执行大型SQL查询的最有效方法



每三个月,我需要上传一个包含大约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中的数据与数组中的值进行比较,并在必要时进行更新。您还可以创建一个数组,只有需要更新的值然后进行大量插入。

在这种方法中,您对数据库的请求没有那么多,因此,资源密集程度应该较低。

相关内容

  • 没有找到相关文章

最新更新