mongodb精简搜索的许多索引

时间:2013-03-25 15:51:13

标签: performance mongodb indexing

在此处提及this问题:

我正在使用mongodb作为我的主数据库在类似的网站上工作。可以想象,每个用户对象都有许多需要可以搜索的字段,例如情绪,城市,年龄,性别,吸烟者,饮酒者等。

现在,除了每个集合不能超过64个索引的问题之外,为所有字段分配索引是否明智?

可能有另一种可行的方法:标签(参考this other问题)如果我在预定标签的数组上设置索引,然后对它们进行文本搜索,那会更好吗?因为我只使用一个索引。你怎么看? E.g:

{
   name: "john",
   tags: ["happy", "new-york", "smoke0", "drink1"]
}

1 个答案:

答案 0 :(得分:2)

MongoDB doesn't (yet) support index intersection,因此规则是:每个查询一个索引。你的一些查询参数具有极低的选择性,极端的例子是布尔值,并且索引这些参数通常会减慢速度而不是加速它们。

作为一个简单的近似,您可以创建一个以最高选择性字段开头的复合索引,例如{“city”,“age”,“mood”,...}。但是,您将始终必须使用城市约束。如果您查询{age,mood},则不会使用上述索引。

如果您可以使用索引将结果集缩小到合理的大小,那么该集合中的扫描将不会是性能损失。更确切地说,如果你说limit(100)并且MongoDB必须扫描200个项目以填满那100个,那么它就不是关键。

危险在于对整个数据库进行非常狭窄的搜索 - 如果你必须对整个数据集进行扫描,以找到唯一不满意的,饮酒不超过95岁的非吸烟者,事情会变得很难看。

如果您想允许非常精细的搜索,SolR等专用搜索数据库可能是更好的选择。

编辑:tags建议看起来有点像使用撬棍给我 - 也许MongoDB FAQ推荐的key/value multikey index是一个更清洁的解决方案:

{ _id : ObjectId(...),
  attrib : [
            { k: "mood", v: "happy" },
            { k: "city": v: "new york" },
            { k: "smoker": v: false },
            { k: "drinker": v: true }
           ]
}

然而,YMMV和'clean'和'fast'通常不指向同一方向,因此tags方法可能并不坏。