MongoDB で大規模なデータセットを並べ替えると、イライラするメモリ不足によるクラッシュが発生することがあります。でも心配しないでください。それを避けるための簡単なヒントがいくつかあります。本題に入る前に、MongoDB クエリ プランナーを使用してクエリが効率的かどうかを確認する方法について別の記事を書きました。これは、内部で実際に何が起こっているかを確認し、問題を早期に発見するための優れた方法です。
大きなデータの塊を並べ替えると、MongoDB はそれをすべてメモリにロードしようとします。データセットが大きすぎると、メモリ不足でクラッシュする可能性があります。これを回避し、クエリがスムーズに実行されるようにする方法を次に示します。
例:
db.users.createIndex({ createdAt: 1 });
クエリ プランナーの出力:
{ "stage": "FETCH", "inputStage": { "stage": "IXSCAN", "keyPattern": { "createdAt": 1 } } }
ここでは、MongoDB がインデックス スキャン (IXSCAN) を使用していることがわかります。これは、MongoDB がスマートで効率的であることを意味します。
例:
db.users.find().sort({ createdAt: 1 });
クエリ プランナーの出力:
{ "stage": "FETCH", "inputStage": { "stage": "IXSCAN", "keyPattern": { "createdAt": 1 } } }
いいですね! MongoDB はインデックスを正しく使用しているため、システムが停止することはありません。
例:
db.users.find().sort({ createdAt: 1 }).limit(100).skip(0);
クエリ プランナーの出力:
{ "stage": "LIMIT", "inputStage": { "stage": "IXSCAN", "keyPattern": { "createdAt": 1 } } }
MongoDB は、結果セットを制限することで賢明に機能しており、現時点で必要なものだけを取得します。
例:
db.users.aggregate([{ $sort: { createdAt: 1 } }], { allowDiskUse: true });
クエリ プランナーの出力:
{ "stage": "SORT", "diskUsed": true, "inputStage": { "stage": "COLLSCAN" } }
MongoDB は現在、並べ替えを支援するためにディスク領域を使用しています。より強力なプランを使用している場合、これはメモリ クラッシュを回避する優れた方法となる可能性があります。
作業をスムーズに進めるためのヒントは次のとおりです。集計パイプラインで並べ替えの基準にしているフィールドに対して 何か (変換、フィールドへの何かの追加、調整など) を実行した場合、MongoDB はインデックスを削除します。インデックスが削除されると、MongoDB は並べ替えにインデックスを使用できなくなります。つまり、クエリが遅くなり、より多くのメモリを使用することになります。
たとえば、ユーザーをサインアップした年で並べ替えたいとします。次のようなことをすると:
db.users.aggregate([ { $project: { year: { $year: "$createdAt" } } }, { $sort: { year: 1 } } ]);
createdAt フィールドを年に変換しているため、MongoDB は createdAt のインデックスを削除します。データを並べ替えるためにコレクション全体をスキャンする必要があるため、処理が大幅に遅くなる可能性があります。
これらのヒントが MongoDB のスムーズな実行を維持できることを願っています。ご質問がございましたら、お気軽にお問い合わせください。コーディングを楽しんでください! ?
以上がMongoDB ソートにおけるメモリ不足クラッシュの防止: 効果的な最適化戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。