MongoDbでのインデックス作成に関する記事をいくつか読んだことがありますが、レコードの物理的なレイアウトについてはわかりません。私は、リレーショナルデータベースのクラスター化(非常に高速な物理ベース)および非クラスター化インデックスについて話すことに慣れました。彼らのドキュメントはセカンダリインデックスに言及していますが、Mongoにはそのような用語はありません。デフォルトでは、_id主キーによってインデックスを作成するようです。主キーはおそらくストレージ上のアイテムの物理的な順序に対応します。説明してください:テーブルごとに1つのインデックスを作成すると、インデックスに従って物理的な順序でアイテムが自動的に保存されますか?そうでない場合は、どういうわけか設定できますか?_idはどうですか、デフォルトでは物理的な順序に対応していますか?
1 に答える
MongoDBインデックスはBツリーインデックスです。インデックスブロックは、ドキュメントの保存に使用されるのと同じデータファイル内に割り当てられます。現在(MongoDBバージョン2.2の時点で)、標準のBツリーインデックス以外のインデックスタイプはサポートされていません。
参照:http ://docs.mongodb.org/manual/core/indexes/
MongoDBは、ディスク上のドキュメントを並べ替えたり、Bツリーインデックスブロックを特定の順序で配置したりすることはありません。MongoDBは、メモリマップトファイルを使用してディスク上のデータ構造にアクセスします。その結果、どのインデックスブロックがRAMにあり、どのインデックスブロックがページアウトされるかという質問は、OSメモリ管理システムに委任されます。
参照:http ://docs.mongodb.org/manual/faq/storage/
MongoDBドキュメントは、常にディスク上で連続しています。すべてのドキュメントは、単一の物理的な場所にのみ存在します。複数のディスクの場所からドキュメントをアセンブルする必要はありません。
MongoDBは最初に、ドキュメントが作成された順序でディスクにドキュメントを割り当てます。ドキュメントが割り当てられたサイズを超えて大きくなると(新しいフィールド、サブドキュメント、または配列要素を追加するドキュメントの更新によって)、ドキュメントはディスク上の新しい場所に移動されます。これは、新しいドキュメントを保持するのに十分な大きさです。
ドキュメントを削除すると、割り当てられたスペースに「穴」が作成されます。これらの穴は空きリストに配置され、新しいドキュメントがこれらの穴に挿入されます。その結果、MongoDBコレクションに対してremove()およびinsert()操作を繰り返し実行すると、ドキュメントは非常に順序付けられていない方法でディスク全体に分散されます。
特に、ドキュメントは_idの順序、または他のインデックスの順序でディスクに配置されません。
MongoDBストレージ管理の詳細については、次のプレゼンテーションをご覧ください。