WiredTigerを搭載したMongoDB3.0には、「インデックスプレフィックス圧縮」と呼ばれる新機能が導入されており、インデックスによって消費されるメモリが大幅に削減されます。インデックスで使用されるメモリが少ないということは、ドキュメントストレージやその他のインデックス用のメモリが多いことを意味し、パフォーマンスが向上することを意味します。
MongoDBで最高のパフォーマンスを得るには、インデックスをメモリに保持しておくと便利です。インデックスのページミスは二重の問題です。1つのページフォールトで実際のインデックスページをメモリに取り込み、別のページフォールトで後でデータページをメモリに取り込みます。
テクノロジー
インデックスプレフィックス圧縮はブロック圧縮(zlib、snappyなど)を使用しませんが、インデックスをメモリに格納するための別の手法です。同一のプレフィックスを1回だけ保存することにより、メモリ使用量を削減します。 「キープレフィックス圧縮」は、データを圧縮するドメイン固有の方法であり、WiredTigerのキーストレージ形式を指します。詳細については、ファイル形式のWiredTigerドキュメントを参照してください。
パフォーマンステスト
パフォーマンステストでは、以下に詳述するドキュメント構造を使用します。
{ employeeID: <long>, firstName: <string>, lastName: <string>, income: <long>, supervisor: {ID: <long>, 'firstName': <string>, 'lastName': <string>;} }
この設定に次のインデックスを追加しました:
Index 1: db.ensureIndex({'employeeID':1}); Index 2: db.ensureIndex({'lastName':1, 'firstName':1}); Index 3: db.ensureIndex({'income':1}); Index 4: db.ensureIndex({'supervisor.lastName':1, 'supervisor.firstName':1})
結果
テスト実行では、同一のデータ(約1,000万レコード)を2つのクラスターに挿入しました。1つは2.6.xレプリカセットで、もう1つはWiredTigerを備えたMongoDB3.0です。次に、両方のクラスター構成に上記のインデックスを追加しました。結果は非常に驚異的です。場合によっては、インデックスサイズに桁違いの違いがあります!
インデックス名 | MMAPインデックスサイズ(MB) | WTインデックスサイズ(MB) | サイズの%縮小 |
{employeeID:1} | 230.7 | 94 | 59% |
{lastName:1、firstName:1} | 1530 | 36 | 97% |
{収入:1} | 230 | 94 | 59% |
{‘supervisor.lastName’:1、‘supervisor.firstName’:1} | 1530 | 35 | 97% |
インデックスに保存されるすべてのメモリは、データや他のインデックスなどのキャッシュに使用できるメモリです。マイレージは異なる場合があります。特定のインデックス構造をテストしてください。インデックスサイズの縮小は、Mongo 3.0の大幅な改善であり、パフォーマンスに大きな違いをもたらす可能性があります。