繁体   English   中英

优化数据库查询-扩展大数据-Laravel 5

[英]Optimization db queries - scaling big data - Laravel 5

我一直在研究使用Laravel 5的Web应用程序。它在Windows 8.1 PC的localhost(xampp)上运行。 4GB RAM,2,67GHz处理器,非常简单。

我经常查询的表包含很多行(10.000给予或接受)-如此之多,以至于编写了一个执行以下操作的路由:

return User::all(); 

运行此命令仅会返回白屏。 有时Chrome控制台会列出500(内部服务器错误)。

显示在查询之前进行的回显或打印,但执行之后不显示任何内容。 查询另一个模型(其表只有2行)可以正确返回数据。

这使我得出结论,我的服务器无法很好地扩展此数据量。 我正在尝试通过修复此问题。

User::all()->chunk(200, function($chunkOfTickets){ /*some code*/});

我希望它将数据分成多个块,以使其在服务器上更容易。 但是,这是行不通的,因为Eloquent首先获取所有数据(由于无法处理而中断了数据),然后才将其划分为大块。

谢谢阅读。

编辑:反复测试,要求越来越多的数据量。 限制大约是26000行(返回27000,并且返回内存不足错误)。

如评论中所述,php日志指出了这一点。 显然我在Laravel可能显示错误消息之前请求了太多的内存,使其崩溃了

[01-Jul-2015 17:27:51 UTC] PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 8376445 bytes) in C:\xampp\htdocs\gamescaffold\vendor\laravel\framework\src\Illuminate\Support\Collection.php on line 791

额外编辑

有没有一种方法可以将来自数据库的答复分成几部分? 喜欢:

User::chunk(200)->all(); /*which obviously does not work*/

如果我直接通过phpMyAdmin向数据库中写入一个看似复杂的查询,它将在0.0045秒内返回37035行。 (我怀疑这里有一些xampp进行的后台优化)

        DB::table("table")
            ->select('column1', 'column2')
            ->orderBy('column2', 'asc')
            ->chunk(70000, function($users) {
            foreach ($users as $row) {
              // To do with data
           }
       }

注意 :我将其发布为答案,因为它涉及一些代码。 我想我完全错过了您在原始问题中的观点,因为尽管您试图将整个结果集返回给客户。 如果仍然缺少任何内容,请发表评论,然后删除此答案。

因此,我想获取一组对象,对其进行处理,然后将其保存回数据库

这很简单!

$chunkSize = 100; // or whatever your memory allows
$totalUsers = User::count();

$chunks = floor($totalUsers / $chunkSize);

for ($chunk = 0; $chunk <= $chunks; $chunk++) {

    $offset = $chunk * $chunkSize;

    $users = User::skip($offset)->take($chunkSize)->get();

    foreach($users as $user)
    {
        // do something

        $user->save();
    }
}

如果花费的时间太长,则从HTTP触发此循环可能会导致超时,因此您应该从控制台运行它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM