MySQL クエリ (Laravel Eloquent の積極的な読み込みと withCount 関数を使用して構築) がありますが、大規模なデータセットを処理するときにパフォーマンスの問題が発生します。以下のクエリを改善する方法はありますか?
すべてのストアを取得し、そのストアに関連する製品の数を数える必要があります (中間テーブルを通じて関連付けられています)。ただし、ストアの type_id が製品の type_id。この 2 番目の条件により、クエリで正しいインデックスが使用されなくなっていると思います。
2 つのモデルの間には中間のテーブルがあります。
gt;store(id, type_id, owner_id) product(id, type_id) store product(shop_id, product_id)
gt;すべての外部キーにインデックスがあります。 shop_product(shop_id, product_id) の複合インデックス。
つまり、私のクエリは次のとおりです:
選択 ショップ。*、 ( 選択する カウント(*) から 製品 内部結合 shop_products 上の products.id = shop_products.product_id どこ ショップID = ショップ製品.ショップID および products.type_id = shop.type_id) から 店 どこ (?)のshops.owner_id
このクエリは、おそらくこのlaravelのwithCount whereColumnクエリを使用せずに、何らかの方法で最適化できる可能性はありますか?
... Shop::withCount(['products' => fn($query) => $query->whereColumn('products. type_id', '=', 'shops.type_id')]);
完全なクエリは次のようになります:
Shop::whereIn('owner_id', [123]) ->withCount(['products' => fn($query) => $query->whereColumn('products.type_id', '=', 'shops.type_id')]) ->get()store(id, type_id) と product(id, type_id) に複合インデックスを追加する必要がありますか?
これはテストしていませんが、同様のことを試してみます
リーリーそこで、いくつかのフィールド (必要なフィールドとアプリが製品を識別するために必要なフィールド) を追加しましたが、カウントのみが必要な場合は、ID なしで試してみます。
「製品」を取得するとすべてのデータが取得されると思いますが、本文/説明などの「テキスト」タイプのフィールドがある場合は遅くなります。
また、よくわかりませんが、既に products 関係にあるため、products.type_id の代わりに type_id を使用してみてもよいでしょう。ストアのプル方法の最適化についても確認してください。
#