Php 如何使用nullif更快地插入Mysql?

Php 如何使用nullif更快地插入Mysql?,php,mysql,csv,php-ini,nullif,Php,Mysql,Csv,Php Ini,Nullif,我正在通过PHP加载一个CSV文件并插入到一个临时表中,这就是我加载PHP脚本和MySQL查询的内容 $i=0; while (($data = fgetcsv($source, 1000, ",")) !== FALSE) { if($i!=0) { $column1=$data[0]; $column2=$data[1]; $colum

我正在通过PHP加载一个CSV文件并插入到一个临时表中,这就是我加载PHP脚本和MySQL查询的内容

    $i=0;
    while (($data = fgetcsv($source, 1000, ",")) !== FALSE)
        {   
            if($i!=0) {
                $column1=$data[0];
                $column2=$data[1];
                $column3=$data[2];
                $column4=$data[3];
                $column5=$data[4];
                $column6=$data[5];
                $query= "INSERT INTO temp_table(column1,column2,column3,column4,column5,column6,load_datetime)
    VALUES (nullif('$column1',''), nullif('$column2',''), nullif('$column3',''), nullif('$column4',''), nullif('$column5',''), nullif('$column6',''),now())";
                mysql_query($query) or die(mysql_error());
            }
            $i++;
        }
我的CSV文件有25000条记录, 这是我的CSV中的一个示例行

        column1,column2,column3,column4,column5,column6
        ,,,13:57:18,,23:00:19
我面临的问题是,当我加载CSV时,需要10分钟以上的时间,在这段时间内,页面变为空白。 我的PHP设置:上传最大文件大小:100M发布最大文件大小:100M最大执行时间:1000最大输入时间:1000

这是我桌子上的细节

   CREATE TABLE temp_table (
       id int(11) NOT NULL,
       column1 time DEFAULT NULL,
       column2 time DEFAULT NULL,
       column3 time DEFAULT NULL,
       column4 time DEFAULT NULL,
       column5 time DEFAULT NULL,
       column6 time DEFAULT NULL,
       load_datetime datetime DEFAULT NULL
   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当我检查temp_表时,它插入了大约8000条记录。请帮助我快速插入的方法

我建议您停止使用mysql扩展mysql_* 并开始使用或

尝试将几个行的数据分组到一个查询中

例如:

$i  = 0;
$i2 = 0;
$sql = "INSERT INTO temp_table(column1,column2,column3,column4,column5,column6,load_datetime) VALUES ";
$values = [];
while (($data = fgetcsv($source, 1000, ",")) !== FALSE) {
    if(++$i == 1)
        continue;
    else {
        $data = array_map(function($item) {
            return $item == '' ? 'NULL' : "'$item'";
        }, $data);
        $values[] = "(" . implode(", ", $data) . ', now()' . ")";
        if (++$i2 == 500) {
            mysql_query ($sql . implode(', ', $values)) or die(mysql_error());
            $values = [];
            $i2 = 0;
        }
    }
}
if (!empty($values)) {
    mysql_query ($sql . implode(', ', $values)) or die(mysql_error());
    $values = [];
}

我认为用PHP脚本需要一些时间。尝试下面的代码,让我知道它有多大的改进,而且你可以一次分组50到100条记录

 while (($data = fgetcsv($source, 1000, ",")) !== FALSE)
{   
if($i!=0)
{
$query= "INSERT INTO temp_table(column1,column2,column3,column4,column5,column6,load_datetime)
VALUES (nullif('$data[0]',''), nullif('$data[1]',''), nullif('$data[2]',''), nullif('$data[3]',''), nullif('$data[4]',''), nullif('$data[5]',''),now())";
mysql_query($query) or die(mysql_error());
}
$i++;
}

谢谢,我已经试过了,它和以前一样耗时。我能知道直接在DB中执行它和在php代码中编写的一样需要多少时间吗?同样在create table代码中,id应该是自动递增字段,或者应该有默认值。如果在查询执行中没有花费更多时间,那么您可以阅读下面的文章。通过这一点,您可以知道在PHP代码中的哪个位置花费了更多的时间。表中的id字段是主键,设置为自动递增。以前我忘记添加了,现在请立即尝试。如果没有帮助,请尝试输出生成的sql echo$sql。内爆“,”,$values。您的解决方案花费了不到2分钟的时间,插入了25000条记录。非常感谢。@davidb 1if++$i==1 continue;`跳过第一行-;