Performance MongoDB-在数组中搜索是否与在普通键中搜索一样快?
假设我有以下设计:Performance MongoDB-在数组中搜索是否与在普通键中搜索一样快?,performance,mongodb,indexing,Performance,Mongodb,Indexing,假设我有以下设计: id | participant_ids ...| [ObjectId(...), ObjectId(...)] id | participant_1_id | participant_2_id 现在我以这种方式查询它: db.events.find({ participant_ids: ObjectId(...) }); 与此相同: db.events.find({ participant_ids: { $in: ObjectId(..
id | participant_ids
...| [ObjectId(...), ObjectId(...)]
id | participant_1_id | participant_2_id
现在我以这种方式查询它:
db.events.find({
participant_ids: ObjectId(...)
});
与此相同:
db.events.find({
participant_ids: {
$in: ObjectId(...)
}
});
我假设这两种方法在性能上没有什么不同(但如果我错了,请纠正我!)
对于每个活动,至少有1名参与者,最多2名参与者。因此,我也可以使用以下设计:
id | participant_ids
...| [ObjectId(...), ObjectId(...)]
id | participant_1_id | participant_2_id
。。。然后像这样询问它…:
db.events.find({
$or: {
participant_1_id: ObjectId(...),
participant_2_id: ObjectId(...)
}
});
如果我不使用索引,这可能不会真正产生影响,但是——当然——我是 对于第一个设计,我将使用以下索引:
db.events.ensureIndex({
participant_ids: 1
});
对于第二个问题,我要说:
db.events.ensureIndex({
participant_1_id: 1,
participant_2_id: 1
});
当你看他们的表现时,他们都有缺点
- 第一次查询:使用
数组可能比使用普通键慢
- 第二次查询:使用
$或
-运算符不是很快
- 第二次查询:的可扩展性不是很强,比如说我想在某个时候释放参与者的限制,这是不可能的(在
$或
-查询的一部分中,您将有无限的键和无限的项)
我的问题是: -我应该使用什么设计? -我可以为数组编制索引吗?文档没有对此做任何说明,我也不确定
Array
s是否正确(因为它们的内容可能会变化很大)
第一个查询:使用数组可能比使用普通键慢
我不这么认为。如果您有一个值(“普通键”)或多个值(“数组”),那么它应该是完全相同的基于索引的访问路径
participant\u 1\u id,participant\u id
太糟糕了。非常感谢!我担心它会变慢(这可能是其他RDB不使用Array
s的原因之一)。很高兴听到它和单独的按键一样快(只是可读性更好)。确认。没有性能差异,而且阵列版本更加灵活。