Yii2数据库操作之批量插入batchInsert()
- 14622
- 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的使用示例