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
方法可能一点也不差。