使用 Eloquent 处理数据太慢了,有没有好的方案

场景
单表需要查询特定条件下的10万条左右的数据

模型查询语句如下:

\App\Models\ServiceBiddings::whereIn('service_id', $ids)->get()->toArray();

查询出来的数据有 89236 条,eloquent的处理时间大概为 10s,

使用 Eloquent 处理数据太慢了,有没有好的方案

sql 的执行时间大概为 370ms
使用 Eloquent 处理数据太慢了,有没有好的方案

DB查询语句如下:

DB::table('service_biddings')->whereIn('service_id', $ids)->get()->toArray();

处理时间为 2s 左右

如果使用 DB 查询的话速度没什么问题,但是有什么方案可以提高 eloquent 的处理速度呢

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 7

一次查10万,什么需求要这样,chunk分批查吧

4年前 评论

swoole

4年前 评论
leo 4年前
leo 4年前
_杭城浪子 4年前
一个人的江湖 4年前
Sher 4年前

chunkId 和队列配合着使用吧。 因为你不用 ORM 的话, 很多东西DB是要去手动实现的肯定是比不了ORM的。 ORM 速度确实要比DB慢一些

4年前 评论

ORM 把数据库映射成对象。
数据库的表(table) --> 类(class)
记录(record,行数据)--> 对象(object)
字段(field)--> 对象的属性(attribute)
所以每条记录都会对应一个实例,内存开销和时间花费都用在 new 对象上了

4年前 评论

不加toArray 试试 应该是没这么慢的

4年前 评论

不加toArray();然后用laravel的collect的方法来处理你后面的逻辑

4年前 评论

首先 select 必要字段以减少数据大小。

其次想必一次性查十万的数据,必然不是为了直接展示给用户,而是做分析、统计或导出,这样的场景是否可以考虑预分析或异步处理。

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!