分块查询 缓解内存开销

来源:互联网 发布:js execcommand 编辑:程序博客网 时间:2024/05/20 02:30

分块查询是为查询大量数据的需要而设计的,假如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;                }    });