「Product」というモデルがあります。 Note_voucher_line
というモデルがあります。これは製品内の関係です
リーリー現在、このようにコードの結果をループする必要がある場合があります
リーリーモデル Note_voucher_line
には 300,000 行以上あります
migration
にインデックスがあります
これは note_voucher_lines
内部インデックスの移行
product テーブルに product_id という名前のインデックスがあります 高速化するためのヘルプがここにあります ありがとう###
この場合、関係を熱心にロードすると役立つことがあります。
リーリーここで何が起こっているのかというと、反復ごとに
with()
メソッドを使用してnote_voucher_lines
テーブルから 2,000 行をプリロードしているということです (product テーブルに 2,000 行が含まれていると仮定します)。以前にロードされた行。これにより、データベース サーバーに対して行われるネットワーク呼び出しの数が減り、300k 呼び出しの代わりに 300k/2k 呼び出しが行われるようになりました。注: データが増大し続けるにつれてメモリ制限に達するのを避けるために、製品にブロック読み込みを使用することも検討する必要があります。 https://laravel.com/docs/10.x/eloquent#chunking-results
遅延の主な理由は、get_note_voucher_lines 関係の遅延読み込みであるようです。
ループ内でこのリレーションシップにアクセスするたびに、Laravel は関連する行を取得するために別のクエリを作成します。これは N 1 問題と呼ばれます。
これを軽減するには、積極的な読み込みを使用します。
リーリーチャンクを使用してビッグ データを処理することもできます:
リーリーid フィールドにインデックスがあることを確認してください。インデックスがあるとおっしゃいましたが、それが単なる外部キー制約ではなく、適切なインデックスであることを確認してください。