如何使用Laravel和MySQL获取大量记录?

时间:2018-02-06 12:54:18

标签: mysql laravel laravel-5 laravel-eloquent laravel-query-builder

我需要专家建议和解决方案。我们通过处理大约100万条记录在这里开发招聘门户网站。我们正面临着获取超时错误的记录。如何使用laravel和MySql处理这些记录?

我们正在尝试按照以下步骤进行操作:

  1. 增加PHP执行时间
  2. MySql Indexing
  3. Paginations

3 个答案:

答案 0 :(得分:3)

使用大型数据集时,您应该将结果分块。这允许您处理较小的负载,减少内存消耗,并允许您在获取/处理其余数据时将数据返回给用户。请参阅有关分块的laravel文档:

https://laravel.com/docs/5.5/eloquent#chunking-results

为了进一步加快速度,您可以利用多线程并生成并发进程,每个进程一次处理一个块。 Symfony的Symfony\Component\Process\Process课程让这很容易。

https://symfony.com/doc/current/components/process.html

答案 1 :(得分:2)

来自the docs

  

如果需要处理数千个数据库记录,请考虑使用chunk方法。此方法一次检索一小部分结果,并将每个块提供给Closure进行处理。此方法对于编写处理数千条记录的Artisan命令非常有用。   例如,让我们一次使用100个记录的整个用户表:

DB::table('users')->orderBy('id')->chunk(100, function ($users) {
    foreach ($users as $user) {
        //
    }
});

答案 2 :(得分:0)

嗨,我认为这可能有帮助

    $users = User::groupBy('id')->orderBy('id', 'asc');

    $response = new StreamedResponse(function() use($users){
        $handle = fopen('php://output', 'w');
        // Add Excel headers
        fputcsv($handle, [
            'col1', 'Col 2'           ]);
        $users->chunk(1000, function($filtered_users) use($handle) {
            foreach ($filtered_users as $user) {
                // Add a new row with user data
                fputcsv($handle, [
                    $user->col1, $user->col2
                ]);
            }
        });
        // Close the output stream
        fclose($handle);
        }, 200, [
            'Content-Type' => 'text/csv',
            'Content-Disposition' => 'attachment; filename="Users'.Carbon::now()->toDateTimeString().'.csv"',
        ]);

        return $response;