首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >优化数据库查询.缩放大数据- Laravel 5

优化数据库查询.缩放大数据- Laravel 5
EN

Stack Overflow用户
提问于 2015-07-01 17:10:30
回答 2查看 4.1K关注 0票数 0

我一直在开发一个使用Laravel 5的网络应用程序,它运行在Windows8.1 PC上的本地主机(xampp)上。4GB内存,2,67 4GB处理器,非常简单。

大多数情况下,我正在查询的表包含了许多行(10.000赋值或取)--太多了,以至于需要编写一个路由:

代码语言:javascript
运行
复制
return User::all(); 

运行此操作只返回一个白色屏幕。有时Chrome控制台会列出500 (内部服务器错误)。

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

这使我得出结论,我的服务器对这么多数据没有很好的扩展。我想通过做来解决这个问题。

代码语言:javascript
运行
复制
User::all()->chunk(200, function($chunkOfTickets){ /*some code*/});

我预计这会将数据分割成块,这样在服务器上就更容易了。但是,这是行不通的,因为雄辩者首先获取所有的数据(因为它无法处理),然后才将其分割成块。

感谢您的阅读。

编辑:只是测试了一遍又一遍,要求越来越多的数据装载。限制大约为26000行(27000行,并返回内存不足错误)。

正如注释中所述,php日志说明了这一点。显然,我请求了太多的内存,在Laravel显示错误信息之前就崩溃了。

代码语言:javascript
运行
复制
[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

额外编辑

有什么办法可以把DB的答复分块吗?像这样:

代码语言:javascript
运行
复制
User::chunk(200)->all(); /*which obviously does not work*/

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

EN

回答 2

Stack Overflow用户

发布于 2015-07-02 14:53:47

注意事项:我将此作为一个答案发布,因为它涉及一些代码。我想我完全忽略了你在最初的问题中的观点,因为我认为你试图将整个结果集返回给客户端。如果我还漏掉了什么,请留下评论,我会删除这个答复。

所以我想要一组对象,用它们做一些事情,并将它们保存回DB中。

太简单了!

代码语言:javascript
运行
复制
$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触发这个循环,您可能会得到一个超时,所以您可能应该从控制台运行它。

票数 1
EN

Stack Overflow用户

发布于 2016-09-21 06:20:41

代码语言:javascript
运行
复制
        DB::table("table")
            ->select('column1', 'column2')
            ->orderBy('column2', 'asc')
            ->chunk(70000, function($users) {
            foreach ($users as $row) {
              // To do with data
           }
       }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31167635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档