考虑集合中的以下数据结构:
{
_id : ObjectId("4ec6c015482c4c8302000001"),
uid : ObjectId("4ec6c015482c4c8302003233") //reference to user's Object ID
someValue : some json object,
}
所述集合将在uid上进行分片。
在这两种情况之间,哪种情况更适合阅读?
选项A)
存储对users对象中每个数据结构的引用并执行此查询:
db.collection.find({_id: {$in: ids}}
选项B)
在uid上创建索引并以这种方式查询:
db.collection.find({uid : ObjectId("4ec6c015482c4c8302003233")})
每个结果集将包含0-20个集合中的数据结构。
总结:找到()20个特定ID或所有与索引ID值匹配的对象(结果集也是20)会更快吗?
答案 0 :(得分:2)
选项(B)更好,更直接:
i)您不需要单独存储_ids的引用。
ii)如果uid
上存在索引,您的查询速度很快,无需优化。
iii)sort
,limit
,findOne
等其他操作可以使用基本语法。
使用选项(A),您必须始终获取整个数据并对其执行操作。
答案 1 :(得分:2)
在uid上创建索引,答案就是这样。
uid V.S. _id _id _id
/|\ | | |
doc doc doc doc doc doc
你推入查询的_id越多,对_id的检查越多,这意味着额外的i / o。获取文档的时间是一样的。
答案 2 :(得分:0)
如果选择选项A)并且没有索引,则选项B)将更具性能。如果您将所有数据完全存储在内存中,那么使用B)会更加高效(因为应用程序只需要比较一个值,而不是几个值),即使很难。