【问题标题】:many indexes for mongodb refined searches用于 mongodb 精细搜索的许多索引
【发布时间】:2013-03-15 04:34:38
【问题描述】:

这里参考this问题:

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

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

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

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

【问题讨论】:

    标签: performance mongodb indexing


    【解决方案1】:

    MongoDB doesn't (yet) support index intersection,所以规则是:每个查询一个索引。您的某些查询参数的选择性极低,最极端的例子是布尔参数,索引这些参数通常会减慢而不是加快速度。

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

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

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

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

    编辑:tags 的建议对我来说有点像使用撬棍——也许 MongoDB 常见问题解答中推荐的 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 与“干净”和“快速”通常并不指向同一个方向,因此tags 方法可能一点也不差。

    【讨论】:

    • solr 也可以与 mongodb 一起使用吗?另外,看看编辑:)
    • SolR 是一个单独的数据库,但在 SolR 中搜索用户 ID 列表并将实际数据存储在 MongoDB 中是有意义的。一方面,无法重新创建实际数据库中的数据,而搜索索引可以。此外,可能必须重建搜索索引,虽然如果您的搜索失败或不完整,这可能不是很酷,但如果您的主数据库出现故障,情况通常会更糟。
    • @mnemosyn 索引交集现在可用。也许您可以发布更新。
    • @AjayGeorge:对于这个用例的这个特定实现,由于数组中的自相交,即将实现的索引交集将自动提供帮助。但是,即将到来的索引交集并不能很好地替代这种基于数组的方法,因为它仅限于两个索引,因此新规则是:每个查询最多两个索引或 10 个自交集。所以,如果你不走运,两个索引只能让你从 100 万次潜在点击到 10k 次潜在点击,这需要大量扫描。所以数组的方式还是比较好的。
    猜你喜欢
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 2018-09-27
    • 2018-10-26
    相关资源
    最近更新 更多