Laravel 5.2使用sum()更快地优化左连接

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel 5.2使用sum()更快地优化左连接相关的知识,希望对你有一定的参考价值。

我有5个表与自定义字段相关,字符串不是id。

我想获得与我想要查询的表相关的每个表的数量的总和。

我设法使用leftjoin使其工作但是至少需要10秒才能给出结果。

我想优化我的查询。

$raohs = Raoh::leftjoin('func','raoh.FFUNCCOD','=','func.FFUNCCOD')
            ->leftjoin('appd','raoh.FRAOCOD','=','appd.FRAOCOD')
            ->leftjoin('altd','raoh.FRAOCOD','=','altd.FRAOCOD')
            ->leftjoin('obrd','raoh.FRAOCOD','=','obrd.FRAOCOD')
            ->where(function($query) {
                $search = Request::get('search');
                $query->where('fraodesc', 'like', '%' . $search . '%')
                    ->orWhere('fsourcod', 'like', '%' . $search . '%');
            })
            ->where('func.FFUNCCOD', 'like', '%' . trim($ffunccod) . '%')
            ->select(DB::raw('fraodesc,fsourcod,raoh.ffunccod,raoh.FRAOCOD,func.ffunction,sum(appd.FAMOUNT) AS fapprop, sum(altd.FAMOUNT) AS fallot, sum(obrd.FAMOUNT) AS foblig'))
            ->orderBy('ffunction')
            ->groupBy('raoh.FRAOCOD')
            ->paginate(20);
答案

看起来你需要在字段raoh.FFUNCCODraoh.FRAOCOD中添加索引,只需确保为这些字段中的值指定足够长的索引长度。例如,如果它只有2或3个符号长,则指定3(或更多)是正常的,但如果它是长串(10+个符号),并且您指定3,则可能会成为问题。特别是,连接可能会开始错误地工作。

如果你使用Laravel's Migrations添加索引,你应该没问题。

如果添加这些索引可以提高性能,请告诉我们。问题还可能在于你的LIKE条件的缓慢表现。

另一答案

在我的问题中似乎我已经在每条记录中加载了我的查询,即SUM(),使其变慢。为了使它更快,我只需要在初始化期间在每个表中使用leftjoin sum()一次。继承人我是怎么做到的。

我记得很久以前我有类似的问题,只有纯SQL。 MySQL Make it faster,add members count to family table

$raohs = Raoh::leftjoin('func','raoh.FFUNCCOD','=','func.FFUNCCOD')
            ->leftjoin(DB::raw('(Select FRAOCOD, sum(FAMOUNT) as FAMOUNT from appd group by FRAOCOD) as appd'),'raoh.FRAOCOD','=','appd.FRAOCOD')
            ->leftjoin(DB::raw('(Select FRAOCOD, sum(FAMOUNT) as FAMOUNT from altd group by FRAOCOD) as altd'),'raoh.FRAOCOD','=','altd.FRAOCOD')
            ->leftjoin(DB::raw('(Select FRAOCOD, sum(FAMOUNT) as FAMOUNT from obrd group by FRAOCOD) as obrd'),'raoh.FRAOCOD','=','obrd.FRAOCOD')
            ->where(function($query) {
                $search = Request::get('search');
                $query->where('fraodesc', 'like', '%' . $search . '%')
                    ->orWhere('fsourcod', 'like', '%' . $search . '%');
            })
            ->where('func.FFUNCCOD', 'like', '%' . trim($ffunccod) . '%')
            ->select(DB::raw('fraodesc,fsourcod,raoh.ffunccod, raoh.FRAOCOD, func.ffunction, appd.FAMOUNT as fapprop, altd.FAMOUNT as fallot, obrd.FAMOUNT as foblig'))
            ->orderBy('ffunction')
            ->groupBy('raoh.FRAOCOD')
            ->paginate(20);

它现在在大约一秒钟内查询

以上是关于Laravel 5.2使用sum()更快地优化左连接的主要内容,如果未能解决你的问题,请参考以下文章

哪种方法可以更快地使用 PHP/Laravel 从 MySQL/MariaDB 获取所有 POI

硒和 Laravel 5.2

在laravel 5.2中使用工厂关系违反完整性约束

从 excel 文件 Laravel 5 更快地将记录插入数据库

Laravel 5.2 路由仅适用于根目录

如何优化我的查询以更快地获得结果?