在此处提及this问题:
我正在使用mongodb作为我的主数据库在类似的网站上工作。可以想象,每个用户对象都有许多需要可以搜索的字段,例如情绪,城市,年龄,性别,吸烟者,饮酒者等。
现在,除了每个集合不能超过64个索引的问题之外,为所有字段分配索引是否明智?
可能有另一种可行的方法:标签(参考this other问题)如果我在预定标签的数组上设置索引,然后对它们进行文本搜索,那会更好吗?因为我只使用一个索引。你怎么看? E.g:
{
name: "john",
tags: ["happy", "new-york", "smoke0", "drink1"]
}
答案 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
方法可能并不坏。