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

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

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


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

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《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把结果集一条一条拿回来做处理,默认是把整个结果集拿回调用端

3年前 评论

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