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

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

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


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

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

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

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

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

3年前 评论
siiiyaa 3年前

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

3年前 评论
da_house

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

3年前 评论
siiiyaa 3年前

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

3年前 评论

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

3年前 评论

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

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

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

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

3年前 评论

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

3年前 评论

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