MongoDB - 在数组中搜索和在普通键中搜索一样快吗?

时间:2011-08-10 10:31:06

标签: performance mongodb indexing

说我有以下设计:

id | participant_ids
...| [ObjectId(...), ObjectId(...)]

现在我以这种方式查询:

db.events.find({
    participant_ids: ObjectId(...)
});

与此相同:

db.events.find({
    participant_ids: {
        $in: ObjectId(...)
    }
});

我认为这两者之间的表现没有差别(但如果我错了,请纠正我!)。


对于每个活动,至少有1个参与者,最多2个参与者。所以我也可以使用以下设计:

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可能比使用普通密钥慢。
  • 第二次查询:使用$or - 运算符的速度不是很快。
  • 第二次查询:不是很可扩展,说我想在某个时候释放参与者的限制,这是不可能的(你可以拥有无​​限的密钥和无限的项目$or - 部分查询。)

我的问题是: - 我应该使用什么样的设计? - 我可以索引Array吗?文档没有说明这一点,我不确定Array是什么(因为它们的内容可能会有很大不同)。

1 个答案:

答案 0 :(得分:5)

  

第一个查询:使用数组可能比使用普通键慢。

我不这么认为。如果您有一个值(“普通键”)或多个(“数组”),它应该是完全相同的基于索引的访问路径。

participant_1_id, participant_2_id真可怕。