mongodb には複数のタイプのindexがあります。この質問では、ソートに使用できる昇順 (または降順) インデックスと、ドキュメントによると「主にシャード クラスターで使用され、ハッシュされたシャード キーをサポートする」ハッシュ インデックスに興味があります ( source )。データの均等分布」(ソース)
db.test.ensureIndex( { "key": "hashed", "sortOrder": 1 } )
エラーが発生するため、次のようなインデックスを作成できないことはわかっています
{
"createdCollectionAutomatically" : true,
"numIndexesBefore" : 1,
"errmsg" : "exception: Currently only single field hashed index supported.",
"code" : 16763,
"ok" : 0
}
私の質問:
インデックス間:
db.test.ensureIndex( { "key": 1 } )
db.test.ensureIndex( { "key": "hashed" } )
クエリdb.products.find( { key: "a" } )
の場合、どちらがよりパフォーマンスが高いですか?、hashed
キーはO(1)
質問にたどり着いた方法:
ではマルチキー インデックスを使用できないことを知る前にhashed
、フォームのインデックスを作成しました。db.test.ensureIndex( { "key": 1, "sortOrder": 1 } )
作成中に、ハッシュ インデックスが昇順インデックスよりもパフォーマンスが高いかどうか疑問に思いました (ハッシュは通常 ですO(1)
)。(上で述べたように)db.test.ensureIndex( { "key": "hashed", "sortOrder": 1 } )
許可されていなかったため、キーをそのまま残しました。しかし、問題は、キーによる検索でハッシュ化されたインデックスの方が高速であることです。
インデックスを作成した状況は次のとおりです。
キーで分類されたドキュメントのソート済みリストを含むコレクションがありました。
例:
{key: a, sortOrder: 1, ...}
, {key: a, sortOrder: 2, ...}
, {key: a, sortOrder: 3, ...}
, {key: b, sortOrder: 1, ...}
, {key: b, sortOrder: 2, ...}
...
分類に を使用し、key
ページネーションに sortOrder を使用したため、常に に 1 つの値をkey
使用してフィルタリングをクエリsortOrder
し、ドキュメントの順序には を使用しました。
これは、次の 2 つのクエリが考えられることを意味します。
- 最初のページの場合
db.products.find( { key: "a" } ).limit(10).sort({"sortOrder", 1})
- そして他のページについては
db.products.find( { key: "a" , sortOrder: { $gt: 10 } } ).limit(10).sort({"sortOrder", 1})
この特定のシナリオでO(1)
は、キーとO(log(n))
sortOrder を検索するのが理想的でしたが、それは許可されませんでした。