在我的用例中,我想通过MongoDB中给定的唯一字符串搜索文档。然而,我希望我的查询是快速和搜索_id将增加一些开销。我想知道在MongoDB中是否有任何好处通过_id搜索任何其他唯一值的文档?
据我所知,对象ID类似于文档中的任何其他唯一值[针对仅搜索的情况提出的要点]。
至于开销,您可以假设我将字符串缓存到objectID,缓存非常小并且在内存中[几乎可以忽略不计],尽管DB很大。
分析查询性能
我建议您使用mongoDB提供的.explain()
来分析您的查询性能。
假设我们要执行这个查询
db.inventory.find( { quantity: { $gte: 100, $lte: 200 } } )
这是查询执行的结果
{ "_id" : 2, "item" : "f2", "type" : "food", "quantity" : 100 }
{ "_id" : 3, "item" : "p1", "type" : "paper", "quantity" : 200 }
{ "_id" : 4, "item" : "p2", "type" : "paper", "quantity" : 150 }
如果我们这样称呼.execution()
db.inventory.find(
{ quantity: { $gte: 100, $lte: 200 } }
).explain("executionStats")
它将返回以下结果:
{
"queryPlanner" : {
"plannerVersion" : 1,
...
"winningPlan" : {
"stage" : "COLLSCAN",
...
}
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 3,
"executionTimeMillis" : 0,
"totalKeysExamined" : 0,
"totalDocsExamined" : 10,
"executionStages" : {
"stage" : "COLLSCAN",
...
},
...
},
...
}
更多细节可以在这里找到
通过_id和索引进行搜索的效率如何
回答你的问题,使用索引总是更有效。索引是一种特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。与_id
是MongoDB提供的默认索引,这使得它更高效。
如果没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择匹配查询语句的文档。
,对,使用_id
这样的指标比较好!
您还可以使用createIndex()
db.collection.createIndex( <key and index type specification>, <options> )
优化MongoDB查询
如果你想优化你的查询,有多种方法可以做到。
- 创建自定义索引以支持查询
- 限制查询结果个数,减少网络需求
db.posts.find().sort( { timestamp : -1 } ).limit(10)
- 使用投影只返回必要的数据
db.posts.find( {}, { timestamp : 1 , title : 1 , author : 1 , abstract : 1} ).sort( { timestamp : -1 } )
- 使用
$hint
选择特定索引
db.users.find().hint( { age: 1 } )
简短的回答,是的,_id
是主键,它被索引了。当然快了。
但是您也可以在其他字段上使用索引,从而获得更有效的查询。