MongoDB ソートにおけるメモリ不足クラッシュの防止: 効果的な最適化戦略

DDD
リリース: 2024-09-20 06:35:31
オリジナル
235 人が閲覧しました

Preventing Out-of-Memory Crashes in MongoDB Sorting: Effective Optimization Strategies

MongoDB ソート時のメモリ不足クラッシュの防止

MongoDB で大規模なデータセットを並べ替えると、イライラするメモリ不足によるクラッシュが発生することがあります。でも心配しないでください。それを避けるための簡単なヒントがいくつかあります。本題に入る前に、MongoDB クエリ プランナーを使用してクエリが効率的かどうかを確認する方法について別の記事を書きました。これは、内部で実際に何が起こっているかを確認し、問題を早期に発見するための優れた方法です。

なぜこのようなことが起こっているのでしょうか?

大きなデータの塊を並べ替えると、MongoDB はそれをすべてメモリにロードしようとします。データセットが大きすぎると、メモリ不足でクラッシュする可能性があります。これを回避し、クエリがスムーズに実行されるようにする方法を次に示します。

簡単な修正:

  • 1.インデックスを使用する これが最も重要なステップです。並べ替えるフィールドには必ずインデックスを付けてください。これにより、MongoDB はすべてをメモリにロードすることなく、データをより高速に並べ替えることができます。インデックスは図書館カードのカタログのようなものだと考えてください。これは、MongoDB が本棚全体をスキャンすることなく、必要なものを見つけるのに役立ちます。

例:

  db.users.createIndex({ createdAt: 1 });
ログイン後にコピー

クエリ プランナーの出力:

  {
    "stage": "FETCH",
    "inputStage": {
      "stage": "IXSCAN",
      "keyPattern": { "createdAt": 1 }
    }
  }
ログイン後にコピー
ログイン後にコピー

ここでは、MongoDB がインデックス スキャン (IXSCAN) を使用していることがわかります。これは、MongoDB がスマートで効率的であることを意味します。

  • 2.クエリの効率を確認してください MongoDB クエリ プランナーを使用して、クエリがインデックスを使用しているか、または低速なコレクション スキャンを実行しているかを確認します。これは、クエリの行程の地図を作成するようなものです。地図は、物事が正しい方向に進んでいるのか、それとも渋滞があるのか​​を示します。 (クエリ プランナーの使用方法について詳しくは、私の記事をご覧ください。)

例:

  db.users.find().sort({ createdAt: 1 });
ログイン後にコピー

クエリ プランナーの出力:

  {
    "stage": "FETCH",
    "inputStage": {
      "stage": "IXSCAN",
      "keyPattern": { "createdAt": 1 }
    }
  }
ログイン後にコピー
ログイン後にコピー

いいですね! MongoDB はインデックスを正しく使用しているため、システムが停止することはありません。

  • 3.制限とページネーション 一度にすべてをロードしようとしないでください。それはトラブルを招くだけです。ページネーションを使用して、より小さなデータの塊を取得し、管理しやすくします。ピザを一度に全部食べるのではなく、一度に一口ずつ食べるようなものです。

例:

  db.users.find().sort({ createdAt: 1 }).limit(100).skip(0);
ログイン後にコピー

クエリ プランナーの出力:

  {
    "stage": "LIMIT",
    "inputStage": {
      "stage": "IXSCAN",
      "keyPattern": { "createdAt": 1 }
    }
  }
ログイン後にコピー

MongoDB は、結果セットを制限することで賢明に機能しており、現時点で必要なものだけを取得します。


  • 4. MongoDB にディスク領域を使用させます それでもメモリに問題がある場合は、並べ替えに一時的にディスク領域を使用するように MongoDB に指示できます。これにより、処理が少し遅くなる可能性がありますが、机の上にすべてを収めることができない場合に、より大きなテーブルを借りるなどのクラッシュを防ぐことができます。ただし、これがどの程度うまく機能するかは、使用している MongoDB プランによって異なります。より多くのリソースを備えた強力なプランを使用している場合、このオプションはさらに役立ちます。限定プランを利用している場合は、パフォーマンスが低下する可能性があります。

例:

  db.users.aggregate([{ $sort: { createdAt: 1 } }], { allowDiskUse: true });
ログイン後にコピー

クエリ プランナーの出力:

  {
    "stage": "SORT",
    "diskUsed": true,
    "inputStage": {
      "stage": "COLLSCAN"
    }
  }
ログイン後にコピー

MongoDB は現在、並べ替えを支援するためにディスク領域を使用しています。より強力なプランを使用している場合、これはメモリ クラッシュを回避する優れた方法となる可能性があります。


  • 5.並べ替えているフィールドの操作に注意してください

作業をスムーズに進めるためのヒントは次のとおりです。集計パイプラインで並べ替えの基準にしているフィールドに対して 何か (変換、フィールドへの何かの追加、調整など) を実行した場合、MongoDB はインデックスを削除します。インデックスが削除されると、MongoDB は並べ替えにインデックスを使用できなくなります。つまり、クエリが遅くなり、より多くのメモリを使用することになります。

たとえば、ユーザーをサインアップした年で並べ替えたいとします。次のようなことをすると:

  db.users.aggregate([
    { $project: { year: { $year: "$createdAt" } } },
    { $sort: { year: 1 } }
  ]);
ログイン後にコピー

createdAt フィールドを年に変換しているため、MongoDB は createdAt のインデックスを削除します。データを並べ替えるためにコレクション全体をスキャンする必要があるため、処理が大幅に遅くなる可能性があります。


読んでいただきありがとうございます!

これらのヒントが MongoDB のスムーズな実行を維持できることを願っています。ご質問がございましたら、お気軽にお問い合わせください。コーディングを楽しんでください! ?

以上がMongoDB ソートにおけるメモリ不足クラッシュの防止: 効果的な最適化戦略の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート