【发布时间】:2016-11-15 04:49:02
【问题描述】:
想要插入或更新近 10000 条记录。插入 for 循环需要很长时间。尝试另一种方式,它只插入值,但在 duplicate_key 条目上显示错误。
$var=0;
if($method == 1)
{
// $sql5 is the current way trying but shows error
$sql5='insert into stu_regnum_hall(hall_name,row,column,register_number,subject_code,exam_date,session,unique_key) values';
for ($i = 0; $i <=$arr_length; $i++)
{
for ($j = 1; $j <= 5; $j++)
{
for($k=0;$k<=4;$k++)
{
if(isset($show[$var+$k]))
{
if($k==0)
{
$hall_name=$arr1[$i];
$row=$j;
}
$column=$k+1;
$reg_num=$show[$var+$k];
$sub_code=$newArr12[$var+$k];
$unique_key=$reg_num.$date.$session;
//current way to insert This is taking too long time to store nearly 10000 records
Yii::$app->db->createCommand('insert into stu_regnum_hall(hall_name,row,column,register_number,subject_code,exam_date,session,unique_key) values ("'.$hall_name.'","'.$row.'","'.$column.'","'.$reg_num.'","'.$sub_code.'","'.$date.'","'.$session.'","'.$unique_key.'") ON DUPLICATE KEY UPDATE hall_name ="'.$hall_name.'",row="'.$row.'",column="'.$column.'",register_number="'.$reg_num.'",subject_code="'.$sub_code.'",exam_date="'.$date.'",session="'.$session.'",unique_key="'.$unique_key.'"')->query();
//concatenation of $sql5
$sql5.='("'.$hall_name.'","'.$row.'","'.$column.'","'.$reg_num.'","'.$sub_code.'","'.$date.'","'.$session.'","'.$unique_key.'") ON DUPLICATE KEY UPDATE hall_name= "'.$hall_name.'",row="'.$row.'",column="'.$column.'",register_number="'.$reg_num.'",subject_code="'.$sub_code.'",exam_date="'.$date.'",session="'.$session.'",unique_ key="'.$unique_key.'",';
}
else
{
break;
}
}
$var=$var+5;
}
}
$sql5.='("");';
// This is the required answer but getting error
Yii::$app->db->createCommand($sql5)->query();
}
$sql5 查询应该在此工作
【问题讨论】:
-
有多长?
-
10000 条记录需要将近 5 分钟。每次插入查询都在 for 循环中执行。这就是原因
-
既然你只是用自动化数据填充它,它的工作速度应该不是问题
-
这似乎是一种太低级的方法,而且效率也很低,因为每一行都有一个新语句。不要忘记使用placeholder values,这将允许您回收多行的查询,以及适当地转义。如果您要加载大量数据,请永远不要低估
LOAD DATA INFILE使用 CSV 源的速度。 -
我只是尝试将插入查询设为常见,并在 for 循环中连接值。在我添加更新条目后它工作得很快,只是它显示错误