2017-11-02 3 views
0

HomeControllerファイルのクエリにより、サイトの速度が低下します。ページが完全に読み込まれるまでに20秒かかります。 (ページサイズは3.9 Mbのみで、ページを読み込むたびにCPU負荷は80%まで上がります)。私は、Elequantよりも速いQuery Builderを使用し、クエリを結合して1つのクエリとして送信するように指示されています。私はこれがあまりにも難しいと思う。これにはいくつかの例がありますか?Laravel:複数のクエリを最適化する方法

にHomeController

public function index() 
{ 
    $sliders = Post::where('post_type','slider') 
     ->with('FeaturedImage','PostField') 
     ->orderBy('created_at', 'desc') 
     ->limit(4) 
     ->get(); 

    $page1 = Post::where([ 
     ['post_type','=','custom_page'], 
     ['slug','=','page1'], 
    ]) 
     ->with('FeaturedImage','PostField') 
     ->latest() 
     ->first(); 


    $page2 = Post::where([ 
     ['post_type','=','custom_page'], 
     ['slug','=','page2'], 
    ]) 
     ->with('FeaturedImage','PostField') 
     ->latest() 
     ->first(); 


    $page3 = Post::where([ 
     ['post_type','=','custom_page'], 
     ['slug','=','page-3'], 
    ]) 
     ->with('FeaturedImage','PostField') 
     ->latest() 
     ->first(); 


    $compacts = array(
     'sliders', 
     'page1', 
     'page2', 
     'page3', 
    ); 
    return view('site.home')->with(compact($compacts)); 
} 

編集: 移行後

public function up() 
{ 
    // Create table for storing roles 
    Schema::create('posts', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->integer('author_id'); 
     $table->integer('category_id')->nullable(); 
     $table->string('title'); 
     $table->text('excerpt')->nullable(); 
     $table->text('body')->nullable(); 
     $table->string('slug')->nullable();//unique() 
     $table->string('post_type')->default('post'); 
     $table->enum('status', ['PUBLISHED', 'DRAFT', 'PENDING'])->default('DRAFT'); 
     $table->timestamps(); 
    }); 
} 
+0

_これはいくつかの例がありますか?_あなたはGoogleを試しましたか?ララベルのドキュメンテーション? – madalinivascu

+0

あなたは基本的に何の理由もなく3回クエリを実行しています – madalinivascu

+0

このクエリを1つのクエリとして結合するにはどうすればいいですか? – Miri

答えて

1

あなたはすべてのページを取得するには、このような何かをしたい、その後、収集groupBy()機能

を使用してページを分割することができます
Post::where('post_type','=','custom_page') 
->whereIn('slug',['page1','page2','page-3']) 
->whereRaw('id IN (select MAX(id) FROM post GROUP BY slug)') 
->with('FeaturedImage','PostField') 
->get() 
->groupBy('slug'); 
2

投稿テーブル、およびいずれもインデックスを使用していません。これは、ポストテーブルの4つの全テーブルスキャンを意味します。さらに、索引付けされていないフィールドをソートしています。これにより、パフォーマンス上の問題も発生する可能性があります。

クエリ条件にはpost_typeslugのインデックスが必要です。 2つの個別の索引または1つの複合索引を作成できます。アプリケーションのニーズによって異なります。

$table->string('slug')->nullable()->index(); 
$table->string('post_type')->default('post')->index(); 
関連する問題