PHP用array_slice函数处理mysql批量添加处理

6 篇文章 0 订阅

有时候我们向数据库中添加记录时会遇到大批数据假如的情况,如果用insert和循环一次向数据库中写入来操作的话这样会

增加数据库连接次数严重影响数据库操作性能,tp5中有提供insertAll批量写入数据的方法可以依次写入大量的数据减少连接

次数,然而当数据量达到几万和几十万的时候insertAll方法写入数据会出现超时和sql过长的报错,超时是因为一次处理的数

据量过大内存处理不过来,sql过长是因为sql语句有限定最大长度超过后就会报错。

这里我们可以将数据分几次循环分批导入,用array_slice将数据分批次导入

注意:当用array_slice函数切分数据是一定要注意函数最后一个参数一定要为false部分insertAll导入在第二批数据以后会写入

失败,因为从第二批数据后key值不是从0自增的,tp5手册上也没有这方面的讲解

//保留原键值

$a = array_slice($arr,4,10,ture);

print_r($a);

结果输出如下:

Array(    [4] => 5    [5] => 6    [6] => 7    [7] => 8    [8] => 9    [9] => fhksadhfj    [10] => 19)

//重置键值

$a = array_slice($arr,4,10,false);

print_r($a);

结果输出如下:

Array(    [0] => 5    [1] => 6    [2] => 7    [3] => 8    [4] => 9    [5] => fhksadhfj    [6] => 19)

不过现在的tp5稍微高点的版本已经自己支持分批次写入数据了不用自己在做处理

$data = [
    ['foo' => 'bar', 'bar' => 'foo'],
    ['foo' => 'bar1', 'bar' => 'foo1'],
    ['foo' => 'bar2', 'bar' => 'foo2']
    ...
];
// 分批写入 每次最多100条数据
Db::name('user')->data($data)->limit(100)->insertAll();

 

for($i=0;$i<10000;$i++){
    $data[$i]['test'] = rand(1000,9000);
}
Db::name('zh_user')->data($data)->limit(10)->insertAll();

 

从调试的sql语句可以看到是分多次插入的

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值