使用 Eloquent 处理数据太慢了,有没有好的方案
场景
单表需要查询特定条件下的10万条左右的数据
模型查询语句如下:
\App\Models\ServiceBiddings::whereIn('service_id', $ids)->get()->toArray();
查询出来的数据有 89236 条,eloquent的处理时间大概为 10s,
sql 的执行时间大概为 370ms
DB查询语句如下:
DB::table('service_biddings')->whereIn('service_id', $ids)->get()->toArray();
处理时间为 2s 左右
如果使用 DB 查询的话速度没什么问题,但是有什么方案可以提高 eloquent 的处理速度呢
一次查10万,什么需求要这样,chunk分批查吧
swoole
chunkId
和队列配合着使用吧。 因为你不用 ORM 的话, 很多东西DB是要去手动实现的肯定是比不了ORM的。 ORM 速度确实要比DB慢一些ORM 把数据库映射成对象。
数据库的表(table) --> 类(class)
记录(record,行数据)--> 对象(object)
字段(field)--> 对象的属性(attribute)
所以每条记录都会对应一个实例,内存开销和时间花费都用在 new 对象上了
不加toArray 试试 应该是没这么慢的
不加toArray();然后用laravel的collect的方法来处理你后面的逻辑
首先
select
必要字段以减少数据大小。其次想必一次性查十万的数据,必然不是为了直接展示给用户,而是做分析、统计或导出,这样的场景是否可以考虑预分析或异步处理。