Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance MongoDB-在数组中搜索是否与在普通键中搜索一样快?_Performance_Mongodb_Indexing - Fatal编程技术网

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的原因之一)。很高兴听到它和单独的按键一样快(只是可读性更好)。确认。没有性能差异,而且阵列版本更加灵活。