Yii2数据库操作之批量插入batchInsert()

  •   
  • 14005
  • PHP
  • 41
  • super_dodo
  • 2016/12/26

数据库真的真的很脆弱!!!在一些应用场景中,需要对一些数据进行批量的插入,例如日志,例如批量新增数据,例如数据导入等。大多数不考虑效率的情况下,可以直接使用foreach循环插入(通俗易懂简便).但是考虑性能和数据库的优化的情况下,你就一定要了解到batchInsert这个方法了。直接上代码:

//要插入的表的名称
$tableName = UserTagList::tableName();

//要插入的字段
$field = ['client_id','tag_id','user_id','add_time'];

//插入的时间
$now = time();

//插入的数据
$insertData[] = [1,1,1,$now];
$insertData[] = [1,1,2,$now];
$insertData[] = [1,1,3,$now];
$insertData[] = [1,1,4,$now];
$insertData[] = [1,1,5,$now];
$insertData[] = [1,1,6,$now];
$insertData[] = [1,1,7,$now];
$insertData[] = [1,1,8,$now];
$insertData[] = [1,1,9,$now];
$insertData[] = [1,1,10,$now];
$insertData[] = [1,1,11,$now];

//执行插入--返回值为插入成功的数目
$okCnt = Yii::$app->db->createCommand()->batchInsert($tableName,$field,$insertData)->execute();

//返回值为插入成功的数目
var_dump($okCnt);



//比较傻的方法---慎用--因为和数据库交互过多
//在数据量大的情况下--数据库很脆弱
foreach ($userList as $user) {
	$model = new UserTagList();
	$model->user_id = $user;
	$model->add_time = time();
	//....
	$model->save();
}


温馨提示,batchInsert批量执行的时候,其中任何一条记录执行失败,则全部失败。和mysql保持一致。

注意事项:

1. SQL语句是有长度限制,在进行数据合并在同一SQL中务必不能超过SQL长度限制,通过max_allowed_packet配置可以修改,默认是1M,测试时修改为8M。

2. 事务需要控制大小,事务太大可能会影响执行的效率。MySQL有innodb_log_buffer_size配置项,超过这个值会把innodb的数据刷到磁盘中,这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。

危楼高百尺,手可摘星辰。不敢高声语,恐惊天上人。---李白《夜宿山寺》