Laravel 游标 cursor 问题,如果游标可以节省内存,那为什么不每次查询都用游标?有什么副作用吗?

foreach (Flight::where('foo', 'bar')->cursor() as $flight) {
    //
}

Laravel 游标 cursor,可以降低内存使用,那 Laravel 查询为什么不默认使用游标?有什么副作用吗?
请大家指点下我,非常感谢!


是因为每次都要一个个模型加载到内存中,在内存够用的情况下,反而性能更低吗?

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

游标只节省了 php 这边的内存,本质上还是把数据先放在 mysql 内存里面,然后一段一段地返回给 php。 所以游标的副作用:消耗 mysql 内存。

4年前 评论
HEPING (楼主) 4年前
讨论数量: 7
da_house

这里面很详细的讲了,希望对您有帮助 stackoverflow.com/questions/454646...

4年前 评论
siiiyaa 4年前

感觉内存最多的DB的一个内存日志记录功能,关了就很省内存了。

4年前 评论
da_house

这里面很详细的讲了,希望对您有帮助 stackoverflow.com/questions/454646...

4年前 评论
siiiyaa 4年前

cursor在默认情况下使用缓冲模式。查询结果会立即从MySQL服务器传输到PHP,然后保存在PHP进程的内存中。

4年前 评论

laravel cursor是通过php yield实现的,主要用于大数据减低内存使用,每次只加载单个模型,通过foreach调用,想进一步了解可以看看laravel文档中的集合lazy-collections部分。

4年前 评论

游标只节省了 php 这边的内存,本质上还是把数据先放在 mysql 内存里面,然后一段一段地返回给 php。 所以游标的副作用:消耗 mysql 内存。

4年前 评论
HEPING (楼主) 4年前

对于小数据量的读取,用yield反而可能用更多的内存,所以只有确认大概率数据量比较大的时候才选择yield。

blog.csdn.net/hel12he/article/deta...

4年前 评论

cursor就是调用端用yield把结果集一条一条拿回来做处理,默认是把整个结果集拿回调用端

4年前 评论

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