RSS DEV コミュニティ フォロー タイトル:「GraphQLにおけるN+1問題 — Laravel APIが遅くなる理由(そしてLighthouseで解決する方法)」 GraphQLはLaravel APIとよく統合され、クリーンなクエリと開発者の満足度を提供します。しかし、リストのサイズが大きくなるにつれて発生する可能性のある一般的なパフォーマンスの問題であるN+1問題は、応答時間を劇的に増加させる可能性があります。この問題は、アイテムのリストに対するクエリが、著者名のような各アイテムの関連データの個別のデータベースクエリもトリガーする場合に発生します。これにより、最初の1回のクエリに加えて、リスト内の各アイテムに対して追加のクエリが発生するため、「N+1」となります。REST APIでは、これはコード上でより顕著になることが多いですが、GraphQLの本来の関連性解決は、大量のデータがロードされるまでこれを隠蔽する可能性があります。N+1を修正する中心的な原則は、ループ内のクエリを回避することです。代わりに、必要なキーを収集し、単一のバッチクエリを実行します。Lighthouseを使用したLaravelの標準的なEloquentリレーションシップでは、これは@belongsToのようなディレクティブによって自動的に処理されます。これらのディレクティブは、リストのサイズに関係なく、WHERE IN句を使用して関連データを単一のSQLクエリにバッチ処理します。直接的なEloquentリレーションシップではない計算フィールドについては、開発者はBatchLoaderのようなツールを使用して手動でバッチ処理を実装する必要があります。これには、必要なすべてのIDを収集し、単一のグループ化されたクエリを実行するローダークラスの作成が含まれます。N+1問題を検出するために、開発者はLaravel Debugbarを使用してSQLクエリ数を監視したり、統合テストでDB::listen()を使用したり、Laravel Telescopeで詳細なリクエスト分析を行ったりできます。重要なガイドラインは、GraphQLクエリのパフォーマンスはリストサイズの増加に伴って低下すべきではないということです。N+1は一般的な最初のハードルですが、GraphQL APIのその他のパフォーマンスに関する考慮事項には、キャッシング戦略、クエリ複雑性の制限、およびレート制限が含まれます。これらのトピックは、LaravelとAngularを使用したGraphQL APIの構築と利用に関する包括的なガイドとともに、専用のトレーニングコースで扱われます。 title: "Le problème N+1 en GraphQL — pourquoi votre API Laravel ralentit (et comment le régler avec Lighthouse)" dev.to
WHERE IN句を使用して関連データを単一のSQLクエリにバッチ処理します。直接的なEloquentリレーションシップではない計算フィールドについては、開発者はBatchLoaderのようなツールを使用して手動でバッチ処理を実装する必要があります。これには、必要なすべてのIDを収集し、単一のグループ化されたクエリを実行するローダークラスの作成が含まれます。N+1問題を検出するために、開発者はLaravel Debugbarを使用してSQLクエリ数を監視したり、統合テストでDB::listen()を使用したり、Laravel Telescopeで詳細なリクエスト分析を行ったりできます。重要なガイドラインは、GraphQLクエリのパフォーマンスはリストサイズの増加に伴って低下すべきではないということです。N+1は一般的な最初のハードルですが、GraphQL APIのその他のパフォーマンスに関する考慮事項には、キャッシング戦略、クエリ複雑性の制限、およびレート制限が含まれます。これらのトピックは、LaravelとAngularを使用したGraphQL APIの構築と利用に関する包括的なガイドとともに、専用のトレーニングコースで扱われます。