2016-08-17 4 views
4

データベースに接続するページがありますが、すべてのデータを収集してからページが読み込まれるまでに約1分かかります。LaravelデータベースMySQLクエリが非常に長くかかる

私は何か間違っているのですか、それともこのプロセスをスピードアップするために何かできますか?

class ReportSummaryController extends Controller 
{ 
    /** 
    * Display a listing of the resource. 
    * 
    * @return \Illuminate\Http\Response 
    */ 

    public function __construct() 
    { 
     $this->middleware('auth'); 
     $user = Auth::user(); 

     if (@$user->name) 
      $details = DB::table('taffiliate') 
       ->where('affID', "=", $user->name) 
       ->get(); 
     else 
      return redirect('/login'); 

     view()->share('details', $details); 
    } 

    public function index() 
    { 


     $user = Auth::user(); 
     $affiliate = $user->name; 


     $affdata = DB::table('toutcome')->select(DB::raw('sum(LenderCommission) as LenderCommission'), 'AffID', 'AppID') 
      ->whereRaw('CompletedDate >= curdate()') 
      ->groupBy('AffID') 
      ->orderBy('AppID', 'ASC') 
      ->get(); 



     $data3 = DB::table('toutcome') 

      ->where('CompletedDate', '>=', \Carbon\Carbon::now()->startOfMonth()) 
      ->whereRaw('AffID Not Like "MW0050"') 

      ->join('tapplicant', 'toutcome.AppID', '=', 'tapplicant.AppID') 
      ->select(DB::raw('DATE_FORMAT(CompletedDate, "%d %M %Y") as CompletedDate, 
           SUM(LenderCommission) as commission, 
           SUM(AffCommission) as affCommission, 
           COUNT(DISTINCT tapplicant.Email) as leadcount, 
           SUM(Status = "A" AND LenderCommission Not Like "0.00") as acceptcount')) 

      ->groupBy(DB::raw('DATE_FORMAT(CompletedDate, "%d %M %Y")')) 
      ->get(); 



     $users = Toutcome::where('CompletedDate', '>=', \Carbon\Carbon::now()->startOfMonth()) 

      ->join('tapplicant', 'toutcome.AppID', '=', 'tapplicant.AppID') 
     ->select(DB::raw('DATE_FORMAT(CompletedDate, "%d %M %Y") as CompletedDate, 
           SUM(LenderCommission) as Commission, 
           SUM(AffCommission) as Affiliate_Commission, 
           COUNT(DISTINCT tapplicant.Email) as Applications, 
           SUM(Status = "A" AND LenderCommission Not Like "0.00") as Sold')) 
      ->whereRaw('AffID Not Like "MW0050"') 
      ->groupBy(DB::raw('DATE_FORMAT(CompletedDate, "%d %M %Y")')) 
      ->get(); 

$comtotal = DB::table('toutcome') 

    ->where('CompletedDate', '>=', \Carbon\Carbon::now()->startOfMonth()) 
    ->whereRaw('LenderCommission Not Like "0.00"') 

    ->sum('LenderCommission'); 

     $subid = DB::table('tapplicant') 
      ->whereRaw('AppAffID Not Like "050"') 
      ->whereRaw('AppAffID Not Like "000"') 
      ->where('AppDate', '>=', \Carbon\Carbon::now()->startOfMonth()) 
      ->select('AppAffID') 
      ->groupBy('AppAffID') 
      ->get(); 

     $lender = DB::table('toutcome') 
      ->select('LenderName') 
      ->groupBy('LenderName') 
      ->get(); 

     $imtotal = DB::table('toutcome') 
      ->where('CompletedDate', '>=', \Carbon\Carbon::now()->startOfMonth()) 
      ->whereRaw('LenderCommission Not Like "0.00"') 
      ->whereRaw('AffID Not Like "0050"') 
      ->count('AppID'); 

     $cototal = DB::table('toutcome') 
      ->where('CompletedDate', '>=', \Carbon\Carbon::now()->startOfMonth()) 
      ->whereRaw('LenderCommission Not Like "0.00"') 
      ->whereRaw('AffID Not Like "0050"') 
      ->where('Status', '=', 'A') 
      ->count('AppID'); 

     $comtotal2 = DB::table('toutcome') 
      ->where('CompletedDate', '>=', \Carbon\Carbon::now()->startOfMonth()) 
      ->whereRaw('LenderCommission Not Like "0.00"') 
      ->sum('LenderCommission'); 

     $comtotal3 = DB::table('toutcome') 
      ->where('CompletedDate', '>=', \Carbon\Carbon::now()->startOfMonth()) 
      ->whereRaw('LenderCommission Not Like "0.00"') 
      ->sum('AffCommission'); 

return view('summary', compact('affdata','data3', 'comtotal', 'subid' , 'users', 'lender', 'imtotal', 'cototal', 'comtotal2', 'comtotal3')); 



    } 
+3

さて、マシンガンのように大量のコマンドをDBに投射しています。あなたのDBに何千もの行がある場合、これらのような操作は多くの時間を使うことになります。 DBのメモリを増やしたり、別のより速いサーバーに移動したりすることができます。私はこれらのクエリを最適化するのに役立つMySQLについて十分に知っていませんが、私はこの種のものが平均的なサーバで長い時間を取ることを知っています。 – Loek

+0

mg。私は前にこのような多くのクエリを見たことがない。 – KmasterYC

+0

@Loek、私は知っている....と私は約350 000のレコードを持っています。テーブルにはそれぞれ約15個のフィールドがあります。 – xTRIFAC70Rx

答えて

0

コントローラは、第一に、それは本当に長いですね。

クエリは非常に詳細に見えますが、1分以上かかることはありません。

雄弁を使ってみることもできますが、これは生のクエリよりも少し速くなります。あなたが言及しなかった

物事は以下のとおりです。

これは、ローカルサーバーまたはリモートサーバーですか? リモートサーバを使用している場合は、"skip-name-resolve"をmy.ini/my.cnfのmysqldで使用し、key_buffer_sizeを更新することになります。

これでスピードが向上しない場合は、特定のサーバーのリソースを確認してください。

+0

私は私のkey_buffer_sizeを更新し、skip_name_resolveを追加しました。私はmysqlサーバーを再起動しなければならなかった。これは100%働いた、ありがとう@MatHatrik – xTRIFAC70Rx

関連する問題