17

まず、私はこの質問について知っています:

mongodbで削除されたスペースを自動圧縮しますか?

私の質問は、DBファイルのサイズを縮小することではなく、削除されたスペースの再利用についてです。コレクションに100Kのドキュメントがあるとすると、そのうちの50Kを削除します。Mongoは、削除されたドキュメントが解放したデータファイル内のスペースを再利用しますか?それとも、単に削除済みとして「マーク」されているのでしょうか。

ディスク上のファイルの実際のサイズについてはあまり気にしません。「それはただ大きくなるだけですか」ということです。

4

1 に答える 1

22

アップデート(2015年3月): 3.0リリースの時点で、MongoDBで利用可能な複数のストレージエンジンがあります。この回答はMMAPストレージエンジン(MongoDB 3.0のデフォルト)に適用されます。他のエンジン(WiredTigerなど)の回答はまったく異なり、調整可能である可能性があります。したがって、別のエンジンを使用している場合は、そのストレージエンジンに関連するドキュメントを読んで、スペースの再利用のデフォルトとオプションを確認してください。

MMAPストレージエンジンでは、ドキュメントが削除されると、残されたスペースが空きリストに入れられます。ただし、スペースを使用するには、後で同じサイズのドキュメントを挿入する必要があります。MongoDBは、特定の時間枠内でそのドキュメントに適切なスペースを見つける必要があります(リストを見るとタイムアウトになると、追加されます)。スペースの再利用はあまり頻繁には起こりません。この削除はデータファイル内で行われるため、ここではディスクスペースの再利用は行われません。これらはすべて、既存のデータファイル内で内部的に行われます。

その後、修復を行うか、セカンダリを最初から再同期すると、データファイルが再書き込みされ、ディスク上のスペースが再利用されます(ドキュメントのパディングも削除されます)。これは、実際のスペースの再利用がディスク上に表示される場所です。その他のアクション(コンパクトを含む)の場合、ディスク上の使用量は変化せず、さらに増加する可能性があります。

2.2以降では、collModコマンドusePowersOf2Sizesオプションを使用して、削除されたスペースを再利用する可能性を高めることができます(これは2.6以降のデフォルトであることに注意してください)。これは、ドキュメントの初期スペース割り当ての効率が少し低いことを意味します(たとえば、400バイトのドキュメントの場合は512バイト)が、新しいドキュメントが挿入されると、そのスペースを再利用できる可能性が高くなります。ドキュメントを大量に削除(または拡大して移動)する場合、長期的にはこれがより効率的になります。

興味のある人のために、多くのストレージコードを書いた人の1人(Mathias Stearn)が、ストレージの内部について素晴らしいプレゼンテーションを行っています。これはここにあります。

于 2012-11-15T01:58:23.197 に答える