laravel 批量插入和in查询速度很慢怎么解决
1. 批量插入,大于2000条一次的时候,laravel处理就花了5s以上,排查应该是在Arr::flatten这里压缩数据,merge花了极大的时间。
2.whereIn 数量很大的时候同上。
分批插拆的太小速度也不行,这种除了自己写原生sql还有什么好的解决方案吗
1. 批量插入,大于2000条一次的时候,laravel处理就花了5s以上,排查应该是在Arr::flatten这里压缩数据,merge花了极大的时间。
2.whereIn 数量很大的时候同上。
分批插拆的太小速度也不行,这种除了自己写原生sql还有什么好的解决方案吗
9 Comments
这个就是这样 所以只能通过编码去约束 in 查询一次不要超过 2000 条 批量插入通过一条 insert 语句实现要好点 日常场景下也没有一次要插2000条的吧 多半是脚本任务才有这种需求
系统数据量比较大,有些场景的确需要这个。递归用这个array_merge真的好慢,感觉改了这个就会快很多。只能领出来单独封装一下了
这个总感觉不太科学,即使我这些是在脚本任务里面,本来原生几秒可执行完的,框架给执行了几分钟。性能损失过于严重。
你是说一条语句花几秒钟?这不科学 你看下是不是 mysql 自身负载问题 查下慢日志
不是语句,是组装绑定的时间几秒,批量插入,真正插入很快的
有点匪夷所思了 按理说也就是个循环的事 怎么会这么长时间 你的代码方便贴出来看下吗
这是个小模拟:
$array = []; while ($number) { $array[] = $item; $number--; }
echo "模拟插入: " . count($array) . " 条数据\n";
$merge = []; $start = microtime(true);
// Laravel里面栋faltten压缩二维数组压缩为一维数组 $merge = array_reduce($array, function($res, $value) { return array_merge($res, array_values($value)); }, []);
// 自己直接遍历,实现二维数组压缩为一维数组 // foreach ($array as $key => $value) { // foreach ($value as $k => $v) { // $merge[] = $v; // } // }
echo "组装耗时: " . (microtime(true) - $start) . "\n绑定总数: " . count($merge). "\n";
你这可不是2000次循环 是几十万次循环 花几秒钟也正常。。。