有时候我们向数据库中添加记录时会遇到大批数据假如的情况,如果用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语句可以看到是分多次插入的