2016-04-03 4 views
2

このクエリを使用して、都市とカテゴリの店舗を除外していました。 storesテーブルに約1000件のレコードがあるとうまくいきました。今、私は5000レコードを持っている場合、結果を生成するために約3-10秒かかります。whereHasでこのクエリを最適化するにはどうすればよいですか?

私の場合、ストアは複数のカテゴリに属します。

Eloquent ormまたはDB::raw()を使用してこのクエリを最適化するにはどうすればよいですか?

$stores = Store::where('city_id', $city_id) 
     ->where('disabled', '0') 
     ->leftJoin('categories','categories.store_id','=', 'stores.id') 
     ->where('category_id', $category_id) 
     ->orderBy('rating','DESC')->paginate(10); 

を、今、あなたの時間の実行を確認します。

$stores = Store::where('city_id', $city_id) 
     ->where('disabled', '0') 
     ->whereHas('categories', function($q) use ($category_id){ 
      $q->where('category_id', '=', $category_id); 
     }) 
     ->orderBy('rating','DESC')->paginate(10); 
+2

あなたは、テーブル上のすべてのインデックスを持っていますか?雄弁な形式でクエリから100%を伝えるのは難しいですが、これは合理的なSQLを生成する必要があります。 –

+0

@JoachimIsakssonはい、両方のテーブルにインデックスがあります。このコマンドを 'SHOW INDEX FROM stores;'を実行するだけで確認できます。 –

+1

この問題を見て、それはあなたとkaymes https://github.com/laravel/framework/issues/3543 –

答えて

3

私はwhereRawDB::raw()またはDB::select()できません。paginate()コレクションを使用して私の問題を解決しました。

問題:

実行時間:11.449304103851s

city_id = 6 & $category_id = 1

$stores = Store::where('city_id', $city_id) 
     ->where('disabled', '0') 
     ->whereHas('categories', function($q) use ($category_id){ 
      $q->where('category_id', '=', $category_id); 
     }) 
     ->orderBy('rating','DESC')->paginate(10); 

ソリューション:

実行時間:0.033660888671875s

city_id = 6 & $category_id = 1

$stores = Store:: 
    where('city_id', $city_id) 
    ->where('disabled', '0') 
    ->whereRaw('stores.id in (select store_id from store_categories_pivot where category_id = ?)', [$category_id]) 
    ->orderBy('rating','DESC') 
    ->paginate(10); 
+0

良いコメント:)の特別なコメントを見てください。あなたがSEとしてグルガオンで仕事を探しているかどうか教えてください。 –

1

あなたは実行を試みることができます。しかし、正確なテーブルの構造やデータがどのように組織化されているかわからないため、このようなクエリに特別な変更を加える必要があるかもしれません。

それはあなたが実行されたクエリ(正確なクエリ)を取得し、正確に何が起こっているとあなたが本当に上のインデックスを持っていないかどうかを示すために、データベースツールで

EXPLAIN your_query 

を実行する必要が解決しない場合すべてが必要です。列に対して

  • 無効
  • 評価
  • categoriesのためにあなたが持っている必要がありますインデックスをCITY_ID

    • :あなたはおそらく列に対してstoresのインデックスを持つ必要があり、あなたのクエリを見てみると

      • CATEGORY_ID

      又はこれらの列のいくつかの組み合わせのためのSTORE_ID。

    関連する問題