讲师中心 微信公众号
AI工具推荐 视频效率加速

Laravel框架分块查询怎么用_Laravel框架大数据处理技巧【详解】

冬敏大大_3026

冬敏大大_3026

发布时间:2026-04-26 12:22:27

|

556人浏览过

|

来源于php中文网

原创

分块查询需谨慎使用,否则导致内存飙升、漏数据或死循环;核心在于避免Eloquent模型缓存、确保主键递增且有序、优先用DB::table()->cursor()等轻量方式。

laravel框架分块查询怎么用_laravel框架大数据处理技巧【详解】

分块查询不是“用了就省内存”,用错反而让内存越查越高、漏数据、卡死。核心问题在于:Laravel 默认把每一批查出来的模型实例全塞进 Model::$instances 静态数组里,不手动清,PHP GC 清不掉;chunk() 用偏移量分页,数据有增删就会跳行或重复;chunkById() 要求主键严格递增,否则可能死循环。

chunk() 为什么内存不降反升

它只是把 get() 拆成多次执行,但每次返回的仍是完整 Eloquent 模型对象,且全部缓存在静态属性中:

  • 每批回调里的 $users 是 User 模型集合,每个实例都带访问器、关系、事件监听器
  • 即使你没显式保存变量,User::$instances 仍持有全部引用,内存持续累积
  • 加了 ->withTrashed() 或 ->withoutGlobalScopes() 后更严重,因为构造逻辑变复杂,缓存更难释放

解决办法不是调大 chunk 尺寸,而是绕过模型层:DB::table('users')->select('id', 'name', 'email')->chunk(500, function ($rows) { ... }) —— 这样返回的是原生数组,无实例开销。

chunkById() 必须满足的三个前提

它靠 WHERE id > ? 推进,比 chunk() 稳定,但极易踩坑:

  • 主键必须是自增整数(INT 或 BIGINT),不能是 UUID、字符串或复合主键
  • 表里不能有 id 为 NULL 的行,否则 WHERE id > last_id 会漏掉
  • 处理过程中不能有新记录插入到当前批次范围中间(比如并发写入 id=1005,而上一批停在 1000),否则会跳过

安全用法示例:User::where('status', 'active')->orderBy('id')->chunkById(1000, function ($users) { ... }, 'id')。注意必须显式写 orderBy('id'),否则 Laravel 不保证顺序。

laravel-specialist
laravel-specialist

精通 Laravel 10+,遵循现代 PHP 实践的 Laravel 专家。擅长优雅语法、Eloquent ORM、队列系统及企业级特性...

下载

真正低内存的分块:DB::table + cursor() 或 pluck()

如果你只读字段、不做模型操作(比如导出 CSV、统计积分、同步 ID 列表),别碰 Eloquent:

  • DB::table('users')->cursor() 返回可遍历游标,逐行取,内存恒定 ≈ 1KB,适合百万级
  • DB::table('users')->pluck('id') 只取单列值,返回 Collection,比 get() 轻 80% 以上
  • 需要关联字段?用 leftJoin + selectRaw 拼好再 cursor(),别 with()

示例:DB::table('users')->leftJoin('profiles', 'users.id', '=', 'profiles.user_id')->select('users.id', 'users.email', 'profiles.bio')->cursor() —— 关联结果直接流式吐出,不建模型。

漏数据和死循环的隐蔽原因

这不是 bug,是设计使然:

  • chunk(100) 底层是 OFFSET 0 LIMIT 100 → OFFSET 100 LIMIT 100,若第 1 批处理中有人删了前 50 条,第 2 批会从原第 150 条开始,中间 50 条永远不被处理
  • chunkById() 在非自增主键上运行,比如 uuid 字段,WHERE uuid > 'abc' 无序,下一批可能反复查同一段
  • 没加索引的 ORDER BY created_at 分块,MySQL 会全表扫描排序,慢到像卡死

关键点:只要涉及更新/删除操作,必须用 chunkById() + 主键索引;只要只读且字段固定,优先 DB::table()->cursor();任何场景下,别信“分块就自动省内存”——得看它返回的是数组还是模型实例。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

5516

2023.06.21

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

1249

2025.12.08

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

243

2026.01.05

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

486

2026.01.05

laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

857

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

855

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2508

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

4381

2024.04.10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 213人学习

Composer手册
Composer手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn