Php 如何使用nullif更快地插入Mysql?
我正在通过PHP加载一个CSV文件并插入到一个临时表中,这就是我加载PHP脚本和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
$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;`跳过第一行-;