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

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

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


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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《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年前 评论