ホームページ  >  に質問  >  本文

追加の条件を使用して、中間テーブルを通じて Laravel および Mysql 関連モデルの数をカウントします。

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

全員に返信(1)返信します

  • P粉618358260

    P粉6183582602023-07-25 10:52:49

    これはテストしていませんが、同様のことを試してみます

    リーリー

    そこで、いくつかのフィールド (必要なフィールドとアプリが製品を識別するために必要なフィールド) を追加しましたが、カウントのみが必要な場合は、ID なしで試してみます。

    「製品」を取得するとすべてのデータが取得されると思いますが、本文/説明などの「テキスト」タイプのフィールドがある場合は遅くなります。

    また、よくわかりませんが、既に products 関係にあるため、products.type_id の代わりに type_id を使用してみてもよいでしょう。ストアのプル方法の最適化についても確認してください。

    #

    返事
    0
  • キャンセル返事