Yii2数据库操作之批量插入batchInsert()
- 15406
- 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的数据刷到磁盘中,这时,效率会有所下降。所以比较好的做法是,在数据达到这个这个值前进行事务提交。
危楼高百尺,手可摘星辰。不敢高声语,恐惊天上人。---李白《夜宿山寺》
相关阅读
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
热门文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例
最新文章
- 通过Google API客户端访问Google Play帐户报告PHP库
- PHP执行文件的压缩和解压缩方法
- 消息中间件MQ与RabbitMQ面试题
- 如何搭建一个拖垮公司的技术架构?
- Yii2中ElasticSearch的使用示例

