制限付きコレクション (Capped Collections)

based on v.15

制限付きコレクション(Capped Collections)とは、固定されたサイズのコレクションで、とてもパフォーマンスのいいauto-LRU age-out機能を持っています。(age outは挿入順を基本としたものです)

加えて、制限付きコレクションは自動的にとても高いパフェーマンスを持ち、コレクション内で挿入された順番を保持します。これは、あるケース、たとえばロギングなどでとても役に立ちます。

固定されたサイズである(制限付き)コレクションを作成

通常のコレクションと違い、制限付きコレクションは、サイズをバイト単位で指定して明示的に作成する必要がらいます。このコレクションのためのデータスペースは前もって確保されます。このサイズはデータベースのヘッダーも含むことに注意してください。

db.createCollection("mycoll", {capped:true, size:100000})

使用法と制限

  • 制限付きコレクションには新しいオブジェクトを追加できます。
  • 制限付きコレクション内のオブジェクトの更新もできますが、オブジェクトのサイズは増やせません。このケースではアップデートは失敗します。(予めオブジェクトをpaddingしておくなどのワークアラウンドはあります。もし手助けが必要なら、サポートフォーラムで連絡してください)
  • 制限付きコレクションからデータの削除はできません。全部のデータを消す場合には、 drop() を使ってください。
    注意: dropした後には、明示的にコレクションを再生成する必要があります。
  • 制限付きコレクションの32bitのマシンでの最大サイズは今のところ1e9バイトです。64bitマシンは、システムのリソースが許す限りになります。

動作

  • 指定したサイズに達すると、新しいオブジェクトで、もっとも古いオブジェクトが置き換えられます。
  • find() を、orderを指定せずに実行すると、オブジェクトは常に挿入した順で返されます。  逆順で取得したい場合には、 find().sort({$natural:-1}) してください。

アプリケーション

  • Logging. 制限付きコレクションはMongo用のloggingに向いています。Mongoは ログ"ファイル"を使いません。logはデータベースに保存されます。制限付きコレクションはデータベース内でこれらくのオブジェクを高いパフェーマンスで保存する手段を提供します。indexを持たないコレクションに挿入するということは、ファイルシステムに追加するのと同じぐらいのスピードが出ます。加えて、build-inのLRUメカニズムにより、loggingのためにディスクスペースを使い切るというリスクがありません。
  • Caching. データベース内で少数のオブジェクトをキャッシュしたい場合、"制限付き"テーブルはこれに対し便利なメカニズムを提供します。この種のアプリケーションでは、書き込みより読み込みが多くなるので、制限付きコレクションにインデックスを使うことがあることに注意してください。
  • Auto Archiving. 定期的に、自動的に"roll out"したい場合には、制限付きコレクションはcronスクリプトなどを使いマニュアルで書き込みするより簡単な方法になります。

推奨

  • 最大限のパフォーマンスのためには、制限付きコレクションはindexを使わないでください。読み込みより書き込みのほうが圧倒的に多い場合には、インデックスを持たない方がいいです。制限付きコレクションにインデックスを持つことはできますが、それは"log speed"の挿入から、"database speed"の挿入になることになります。この場合でもそれなりには早いでしょう。
  • natural ordering を使い、最近挿入された要素を効果的に取得してください。これはlogファイルをtailするみたいなものです。

オブジェクト数で制限する。

また、コレクション内のオブジェクト数で制限することもできます。制限に達すると、最初に挿入されたのから順にroll outされます。

オブジェク数で制限する場合には、 createCollection() を呼ぶときに、 max: パラメータを付けてください。

Note: 制限するオブジェクト数を指定する場合、sizeも同時に指定してください。指定したオブジェクトの数に対して十分な広さがある確認してください。さもないと、期待より早くroll outされます。 validate() を使いどのくらいのサイズをコレクションが使っているか知ることができま。そこからどのくらいのサイズが必要が見積もれます。

db.createCollection("mycoll", {capped:true, size:100000, max:100});
db.mycoll.validate();

Tip: プログラミングをするとき、最も最近作られたオブジェクトのみを保存するのに、 max=1 でコレクションを作るのは便利な方法です。

通常のコレクションでも前もってスペースを確保

createCollection コマンドは制限付きコレクション以外でも使えます。たとえば、

db.createCollection("mycoll", {size:10000000});
db.createCollection("mycoll", {size:10000000, autoIndexId:false});

制限付きコレクションではないコレクションを明示的に作るということは、新しいコレクションに対してパラメータを設定できるということです。たとえば、コレクションのサイズを指定は、コレクション用に予めディスクスペースを確保することになります。 autoIndexId フィールドに true または false を指定し、明示的に _id フィールドに対してunique indexの有効/無効を指定できます。デフォルトでは、制限付きではないコレクションでは自動的に作られ、制限付きコレクションでは作られません。

デフォルトでは、index は制限付きコレクションでは自動的に作られません。

参照


Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.

IF YOU HAVE A QUESTION, POST IT TO THE USER GROUP.

These pages are fine for comments, but for questions, your best bet will always be the MongoDB User Group.

blog comments powered by Disqus