mysql chunk 函数_Laravel中的chunk组块结果集处理与注意问题
前言
如果你需要处理成千上万个 Eloquent 结果,可以使用 chunk 命令。chunk 方法会获取一个“组块”的 Eloquent 模型,并将其填充到给定闭包进行处理。使用 chunk 方法能够在处理大量数据集合时能够有效减少内存消耗:
PHP;">
Flight::chunk(200,function ($flights) {
foreach ($flights as $flight) {
//
}
});
$all_ark=Arkvolume::chunk(50000,function ($flights) {
foreach ($flights as $flight) {
$GLOBALS['something'][] = $flight['id'];
}
});
var_dump($GLOBALS['something'] );exit;
这段代码是执行一个100条的数据进行更新,当执行完成后继续后面的另一百条数据……
也就是说他每次操作的是一个数据块而不是整个数据库。
需要注意的是:当使用带筛选的条件的chunk时,如果是自更新,那么你会漏掉一些数据,接着看代码:
chunk(100,function ($users) {
foreach ($users as $user) {
$user->update(['approved' => 1]);
}
});
如果要运行上面的代码,并不会有报错,但是where条件是筛选approved为0的user然后将approved的值跟新为1。
在这个过程中,档第一数据库的数据被修改后,下一个数据块的数据将是在被修改后的数据中选出来的,这个时候数据变了,而page也加了1。所以执行结束后,只对数据中一半的数据进行了更新操作。
如果没有明白的话,我们来看一下chunk的底层实现。还以上面的代码为例,假如一共有400条数据,数据被按照100条进行分块处理。
page = 1: 最开始的时候page为1,选取1-100条数据进行处理;
page = 2: 这时候前一百数据的approved值全部为1,那么在次筛选的时候数据将从第101条开始,而这个时候的page=2,那么处理的数据将是第200-300之前的数据
之后依旧。
forPage($page = 1,$count)->get();
while (count($results) > 0) {
// On each chunk result set,we will pass them to the callback and then let the
// developer take care of everything within the callback,which allows us to
// keep the memory low for spinning through large result sets for working.
if (call_user_func($callback,$results) === false) {
return false;
}
$page++;
$results = $this->forPage($page,$count)->get();
}
return true;
}
Laravel chunk 使用注意的问题
使用 Laravel 的 chunk 可以用来优化大结果集的查询,提供分块处理数据的方法,但是如下的例子就会有问题:
update(['approved' => 1]);
}
});
原因在于第一次查询:
sql;">
select * from users where approved = 0 limit 100 offset 0;
update 这一批数据的 approved 为 1 之后,
再看第二次查询:
sql;">
select * from users where approved = 0 limit 100 offset 100;
这个时候因为有 where approved = 0 条件并且偏移量从 100 开始,这样其实就漏掉了 100 条 approved 为 0 的数据。
所以,我们要避免使用 chunk 的时候,更改和过滤条件的字段的值。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对编程之家的支持。
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250
mysql chunk 函数_Laravel中的chunk组块结果集处理与注意问题相关推荐
- mysql getnum函数_Mysql中实现提取字符串中的数字的自定义函数分享
因需要在MysqL的数据表中某一字符串中的字段提取出数字,在网上找了一通,终于找到了一个可用的MysqL函数,可以有效的从字符串中提取出数字. 该MysqL提取出字符串中的数字函数如下: CREATE ...
- php mysql ifnull函数_MYSQL中的IFNULL函数
手册上: IFNULL(expr1,expr2) 假如expr1不为NULL,则IFNULL()的返回值为 expr1;否则其返回值为 expr2.IFNULL()的返回值是数字或是字符串,具体情况取 ...
- mysql算法函数_mysql中的函数总结
mysql中常用日期时间函数 MySQL服务器中的三种时区设置: ①系统时区---保存在系统变量system_time_zone ②服务器时区---保存在全局系统变量global.time_zone ...
- mysql创建函数1418_Mysql中创建函数报“ERROR 1418 ”的解决方法
我们在使用mysql数据库开发项目的时候,有时Mysql系统自带的函数不能完全满足我们开发的需要,解决方法是自己创建函数,可以有可能在你创建函数的过程事会报出Error 1418错误,对于报这种错误的 ...
- mysql开窗函数over_sql中的开窗函数over()
今天刷LeetCode的时候看到一道题,题目是这个样子 LeetCode上面要求是用mysql来解决这道题,因为平时我上班的时候大部分时间都是在sqlserver上操作,所以一看到这个题目的要求我脑海 ...
- mysql olap 函数_Mysql中的窗口函数
窗口函数初识 窗口函数也叫OLAP函数(Online Anallytical Processing,联机分析处理),可以对数据进行实时分析处理.窗口函数和group by有类似之处,其区别在于窗口会对 ...
- mysql explode函数_hive中,lateral view 与 explode函数
hive中常规处理json数据,array类型json用get_json_object(#,"$.#")这个方法足够了,map类型复合型json就需要通过数据处理才能解析. exp ...
- mysql diff函数_MYSQL中 的datediff、timestampdiff函数
对mysql中日期范围搜索的大致有三种方式: 1.between and语句: 2.datediff函数: 3.timestampdiff函数: 下面就具体说明下这三种方式: 第一种: between ...
- mysql pmt函数,Mybatis中Oracle和Mysql的Count字段问题
Mybatis中Oracle和Mysql的Count字段问题 我们在进行项目开发时经常会碰到查询总数的问题,所以我们直接是用select count(1) from table来进行查询.那么在Myb ...
- mysql group函数_mysql中group_concat函数的使用
一.group_concat函数的功能 将group by产生的同一个分组中的值连接起来,返回一个字符串结果. group_concat函数首先根据group by指定的列进行分组,将同一组的列显示出 ...
最新文章
- opencv处理dicom图像_图像处理|opencv| 利用opencv把照片变换成素描风格
- 微型计算机的什么接口主要作为打印机接口,微型计算机及其接口技术试题及答案(2006年10月)...
- 动态矩阵控制matlab程序_【实时关注】你了解MATLAB吗?
- [patl2-001]紧急救援
- python引入redis_使用python向Redis批量导入数据
- 保姆级教学:缓存穿透、缓存击穿和缓存雪崩!
- 演练 青鸟游戏迷你平台
- 随机模拟的基本思想和常用采样方法(sampling)
- ★★iPhone越狱后必装软件和一些心得教程,送给广大的小白们,希望你们能从小白变成“小黑”★★
- 外螺纹对照表_螺纹螺距对照表
- html内外边距区别,css水平边距和垂直边距 css中的内边距和外边距?
- Hadoop实战第2版 - 电子书下载(高清版PDF格式+EPUB格式)
- php strtolower 大写,PHP strtolower()用法及代码示例
- 【CST】贴片天线阵列设计
- 什么是SEM?SEM是否包括SEO?
- xshell 6+xftp 6卸载时出现1628错误解决办法
- 用ADC0809实现八通道采集
- GitHub 上值得收藏的100个精选前端项目!你知道几个?
- 已经围上为何不算目_有答案的小学语文教师教材过关考试模拟试卷1
- C++别踩白块小游戏