在 mongodb 中有多种类型的index。对于这个问题,我对可用于排序的升序(或降序)索引和根据文档“主要与分片集群一起使用以支持散列分片键”(来源)确保“更多数据分布均匀”(来源)
我知道你不能像这样创建索引: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 进行分页,所以我总是使用一个值来查询过滤,key
并使用sortOrder
文档的顺序。
这意味着我有两个可能的查询:
- 对于第一页
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 是理想的,但这是不允许的。