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

Laravel の foreach ループを 2k で最適化し、リレーショナル検索を 200k から改善して実行時間を短縮します。

「Product」というモデルがあります。 Note_voucher_line

というモデルがあります。

これは製品内の関係です

リーリー

現在、このようにコードの結果をループする必要がある場合があります

リーリー

モデル Note_voucher_line には 300,000 行以上あります migration にインデックスがあります これは note_voucher_lines 内部インデックスの移行

です リーリー

product テーブルに product_id という名前のインデックスがあります 高速化するためのヘルプがここにあります ありがとう###

P粉707235568P粉707235568177日前370

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

  • P粉492959599

    P粉4929595992024-03-31 12:05:45

    この場合、関係を熱心にロードすると役立つことがあります。

    リーリー

    ここで何が起こっているのかというと、反復ごとに with() メソッドを使用して note_voucher_lines テーブルから 2,000 行をプリロードしているということです (product テーブルに 2,000 行が含まれていると仮定します)。以前にロードされた行。これにより、データベース サーバーに対して行われるネットワーク呼び出しの数が減り、300k 呼び出しの代わりに 300k/2k 呼び出しが行われるようになりました。

    注: データが増大し続けるにつれてメモリ制限に達するのを避けるために、製品にブロック読み込みを使用することも検討する必要があります。 https://laravel.com/docs/10.x/eloquent#chunking-results

    返事
    0
  • P粉244730625

    P粉2447306252024-03-31 09:24:23

    遅延の主な理由は、get_note_voucher_lines 関係の遅延読み込みであるようです。

    ループ内でこのリレーションシップにアクセスするたびに、Laravel は関連する行を取得するために別のクエリを作成します。これは N 1 問題と呼ばれます。

    これを軽減するには、積極的な読み込みを使用します。

    リーリー

    チャンクを使用してビッグ データを処理することもできます:

    リーリー

    id ​​フィールドにインデックスがあることを確認してください。インデックスがあるとおっしゃいましたが、それが単なる外部キー制約ではなく、適切なインデックスであることを確認してください。

    返事
    0
  • キャンセル返事