分块查询 缓解内存开销

分块查询是为查询大量数据的需要而设计的,假如think_data表已经有超过1万条记录,但是一次性取那么大的数据会导致内存开销非常之大,但确实又有这个需要(例如查询所有的数据并导出到excel),采用分块查询可以缓解这个问题。

使用分块查询,可以把1万条记录分成100次处理,每次处理100条记录,代码示例如下:

Db::name('data')
    ->where('status', '>', 0)
    ->chunk(100, function ($list) {
        // 处理100条记录
        foreach($list as $data){
            
        }
    });

第二个参数可以是有效的callback类型,包括使用闭包函数。

系统会按照主键顺序查询,每次查询100条,如果你不希望使用主键进行查询,或者没有主键的话,则需要指定查询的排序字段(但必须是唯一的),例如:

Db::name('user')
    ->where('status', '>', 0)
    ->chunk(100, function ($list) {
        // 处理100条记录
        foreach($list as $data){
        
        }
    }, 'uid');

然后交给callback进行数据处理,处理完毕后继续查询下一个100条记录,如果你需要在中途中断后续的查询,只需要在callback方法调用中返回false即可,例如:

Db::name('data')
    ->where('status','>',0)
    ->chunk(100,function($list){
        foreach($list as $data){
            // 返回false则中断后续查询
            return false;        
        }
    });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值