【问题标题】:Mysql taking long time to insert and update Yii FrameworkMysql 需要很长时间才能插入和更新 Yii 框架
【发布时间】: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 循环中连接值。在我添加更新条目后它工作得很快,只是它显示错误

标签: php mysql yii2


【解决方案1】:

尝试 Yii2 batchInsert 并稍微自定义使用 INSERT IGNOREREPLACEON DUPLICATE KEY UPDATE。它会很快插入。

$sql = Yii::$app->db->queryBuilder->batchInsert('your_table_name', ['column1', 'column2','column3',...], $dataArray);
// For IGNORE on Duplicate
//$sql = 'INSERT IGNORE' . mb_substr($sql, strlen('INSERT'));
// For Replace on Duplicate
//$sql = 'REPLACE' . mb_substr($sql, strlen('INSERT'));
// For Update on Duplicate
$sql .= ' ON DUPLICATE KEY UPDATE `column1` = VALUES(`column1`), `column2` = VALUES(`column2`), ...';

Yii::$app->db->createCommand($sql)->execute();

参考:http://www.yiiframework.com/doc-2.0/yii-db-querybuilder.html#batchInsert()-detail

【讨论】:

  • 不应该忽略应该更新 if unique key present
  • @SanthoshPrabu 没问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多