このクエリを使用して、都市とカテゴリの店舗を除外していました。 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);
あなたは、テーブル上のすべてのインデックスを持っていますか?雄弁な形式でクエリから100%を伝えるのは難しいですが、これは合理的なSQLを生成する必要があります。 –
@JoachimIsakssonはい、両方のテーブルにインデックスがあります。このコマンドを 'SHOW INDEX FROM stores;'を実行するだけで確認できます。 –
この問題を見て、それはあなたとkaymes https://github.com/laravel/framework/issues/3543 –