追加の条件を使用して、中間テーブルを通じて Laravel および Mysql 関連モデルの数をカウントします。
P粉514458863
P粉514458863 2023-07-24 15:47:02
0
1
491

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) に複合インデックスを追加する必要がありますか?

P粉514458863
P粉514458863

全員に返信 (1)
P粉618358260

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

リーリー

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

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

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

#

いいねを押す+0
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート
    私たちについて 免責事項 Sitemap
    PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!