2

在这里提到这个问题:

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

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

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

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

1 回答 1

2

MongoDB (还)不支持索引交集,所以规则是:每个查询一个索引。您的某些查询参数的选择性极低,极端的例子是布尔值,索引这些参数通常会减慢而不是加快速度。

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

如果您可以使用索引将结果集缩小到合理的大小,那么该集中的扫描将不会影响性能。更准确地说,如果您说limit(100)MongoDB 必须扫描 200 个项目来填充这 100 个项目,那么这并不重要。

危险在于对数据库的搜索范围非常狭窄——如果您必须对整个数据集执行扫描以找到唯一不快乐、饮酒且年龄超过 95 岁的不吸烟者,事情会变得很糟糕。

如果您想允许非常细粒度的搜索,那么像 SolR 这样的专用搜索数据库可能是更好的选择。

编辑:这个tags建议对我来说有点像使用撬棍——也许MongoDB FAQ 中推荐的键/值多键索引是一个更干净的解决方案:

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

但是,YMMV 和 'clean' 和 'fast' 通常并不指向同一个方向,因此这种tags方法可能一点也不差。

于 2013-03-25T16:43:53.777 回答