如何更快地 Mysql Insert with nullif?
How to faster Mysql Insert with nullif?
我正在通过 PHP 加载 CSV 文件并插入临时 table,这就是我加载 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 设置: upload_max_filesize: 100M post_max_size:100M max_execution_time:1000 max_input_time:1000.
这是我的 table 详细信息
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_table 时,它已经插入了大约 8000 条记录。请帮助我提供一种更快插入的方法。
I would be recommended to you stop use mysql extension (mysql_*)
and start use mysqli or PDO.
尝试将几行数据分组到一个查询中。
示例:
$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++;
}
我正在通过 PHP 加载 CSV 文件并插入临时 table,这就是我加载 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 设置: upload_max_filesize: 100M post_max_size:100M max_execution_time:1000 max_input_time:1000.
这是我的 table 详细信息
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_table 时,它已经插入了大约 8000 条记录。请帮助我提供一种更快插入的方法。
I would be recommended to you stop use mysql extension (mysql_*)
and start use mysqli or PDO.
尝试将几行数据分组到一个查询中。
示例:
$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++;
}