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.FFUNCCOD
和raoh.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