私のグローバルな知識と経験に基づいて、いくつかのヒントを紹介します。
短いフィールド名を使用する
MongoDBは、ドキュメントごとに同じキーを保存します。この繰り返しにより、ディスク容量が増加します。これは、あなたのような非常に巨大なデータベースでパフォーマンスの問題を引き起こす可能性があります。
長所:
- ドキュメントのサイズが小さいため、ディスク容量が少なくなります
- RAMに収まるドキュメントが増えました(キャッシュが増えました)
- 一部のシナリオでは、doインデックスのサイズが小さくなります
短所:
- 読みにくい名前
インデックスサイズを最適化
インデックスサイズが小さいほど、RAMに収まり、インデックスミスが発生しにくくなります。たとえば、gitcommitのSHA1ハッシュについて考えてみます。 git commitは、多くの場合、最初の5〜6文字で表されます。次に、すべてのハッシュの代わりに5〜6文字を保存します。
パディングファクターを理解する
コストのかかるドキュメント移動を引き起こすドキュメントで発生する更新の場合。このドキュメントが移動すると、古いドキュメントが削除され、新しい空の場所に更新され、インデックスが更新されます。これにはコストがかかります。
更新が発生した場合にドキュメントが移動しないようにする必要があります。コレクションごとに、ドキュメントの挿入時に、実際のドキュメントサイズとは別に割り当てる余分なスペースの量を示すパディング係数が含まれます。
コレクションのパディング係数は、次を使用して確認できます:
db.collection.stats().paddingFactor
手動でパディングを追加
あなたの場合、あなたは成長する小さな文書から始めるのはかなり確実です。しばらくしてからドキュメントを更新すると、複数のドキュメントが移動します。したがって、ドキュメントにパディングを追加することをお勧めします。残念ながら、パディングを追加する簡単な方法はありません。挿入を実行しているときにいくつかのキーにランダムなバイトを追加し、次の更新クエリでそのキーを削除することで、これを行うことができます。
最後に、将来ドキュメントにいくつかのキーが来ることが確実な場合は、それらのキーにいくつかのデフォルト値を事前に割り当てて、さらに更新してもドキュメントサイズが大きくなり、ドキュメントが移動しないようにします。
ドキュメントの移動を引き起こすクエリの詳細を取得できます:
db.system.profile.find({ moved: { $exists : true } })
多数のコレクションと少数のコレクションの多数のドキュメント
スキーマは、アプリケーションの要件に依存するものです。最新のN日間のデータのみをクエリする膨大なコレクションがある場合は、オプションで個別のコレクションを選択でき、古いデータを安全にアーカイブできます。これにより、RAMへのキャッシュが適切に行われるようになります。
作成されたすべてのコレクションには、コレクションの作成コストよりも高いコストがかかります。各コレクションの最小サイズは、数KB + 1インデックス(8 KB)です。すべてのコレクションには名前空間が関連付けられています。デフォルトでは、24Kの名前空間がいくつかあります。たとえば、ユーザーごとにコレクションを作成することは、スケーラブルではないため、お勧めできません。ある時点以降、Mongoでは新しいインデックスのコレクションを作成できなくなります。
通常、多くのコレクションを使用しても、パフォーマンスが大幅に低下することはありません。たとえば、常に月に基づいてクエリを実行していることがわかっている場合は、月に1つのコレクションを選択できます。
データの非正規化
クエリまたはクエリのシーケンスに関連するすべてのデータを同じディスクの場所に保持することを常にお勧めします。異なるドキュメント間で情報を複製する必要があります。たとえば、ブログ投稿では、投稿のコメントを投稿ドキュメント内に保存する必要があります。
長所:
- インデックスエントリの数が少なくなるため、インデックスサイズは非常に小さくなります
- クエリは非常に高速で、必要なすべての詳細を取得することも含まれます
- ドキュメントサイズはページサイズに匹敵します。つまり、このデータをRAMに取り込む場合、ほとんどの場合、他のデータをページに取り込むことはありません。
- ドキュメントの移動により、ページ内の小さなチャンクではなく、ページを解放していることが確認されます。これは、以降の挿入で使用されない可能性があります。
上限付きコレクション
上限付きコレクションは、循環バッファーのように動作します。それらは特別なタイプの固定サイズのコレクションです。これらのコレクションは、非常に高速な書き込みと順次読み取りを受け取ることができます。サイズが固定されているため、割り当てられたスペースがいっぱいになると、古いドキュメントを削除して新しいドキュメントが書き込まれます。ただし、ドキュメントの更新は、更新されたドキュメントが元のドキュメントサイズに適合する場合にのみ許可されます(柔軟性を高めるためにパディングを使用してください)。