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

标签 php mysql sql laravel-5 chunks

我一直在开发一个使用 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*/});

我期望将数据分割成 block ,以便在服务器上更容易处理。然而,这不起作用,因为 Eloquent 首先获取所有数据(并因为无法处理而中断),然后才将其分成 block 。

感谢您的阅读。

编辑:只是一遍又一遍地测试,请求越来越多的数据。限制约为 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

额外编辑

有没有办法可以将数据库的回复分成 block ?像:

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

如果我直接通过 phpMyAdmin 向数据库写入看似复杂的查询,它将在 0.0045 秒内返回 37035 行。 (我怀疑 xampp 或其他东西在这里进行了一些底层优化)

最佳答案

注意:我将其发布为答案,因为它涉及一些代码。我想我完全错过了你在最初问题中的观点,因为我认为你试图将整个结果集返回给客户端。如果我仍然遗漏了什么,请发表评论,我将删除此答案。

So I want to take a set of objects, do stuff with them and save them back to the DB

这很简单!

$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 触发此循环,则可能会超时,因此您应该从控制台运行它。

关于php - 优化数据库查询 - 扩展大数据 - Laravel 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31167635/

相关文章:

php - 从闭包内访问私有(private)变量

mysql - 如何在 MySQL 中输入 'blank' 值

SQL - 删除重复行但保留空行

php - PHP如何增加jwt过期时间

php - Laravel:限制嵌套关系

php - 从 Controller 访问 Liip Imagine bundle - 将服务分配给变量(Symfony 4)

mysql - SQL 中具有相似日期的行分组在一起

mysql - GROUP BY 在 SELECT 中选择

mysql - 将 twiki 发布数据存储在 mysql 数据库中

SQL Server 中的 MySQL GROUP BY 错误