【问题标题】:MongoDB limit to number of sparse indexesMongoDB 限制稀疏索引的数量
【发布时间】:2012-07-07 18:37:36
【问题描述】:

我特别需要在 MongoDB 集合中拥有特别大量的稀疏索引。这个数字可能只有几千。每个存储的文档将只使用相对较少的索引,平均每个大约 10 到 30 个。但是,这些文档千差万别,每个文档都需要不同的索引集。

我找不到任何文档说明在集合上拥有 > 1000 个稀疏索引可能产生的影响。空间不是问题。我特别关心的是对节省时间和查询设置的影响。 MongoDB 是否会因如此大的开销而陷入困境?

我会运行自己的基准测试,但我想知道 a) 是否有人知道这方面的一些官方指导方针,并且 b) 对这种情况有任何经验。

【问题讨论】:

    标签: mongodb indexing mongodb-query


    【解决方案1】:

    您可能会遇到命名空间限制(索引、集合的总数等),但可以使用 --nssize 解除限制:http://www.mongodb.org/display/DOCS/Using+a+Large+Number+of+Collections

    插入会增加一些开销,但一旦意识到您插入的文档不需要添加到大多数索引中,它应该会“快速失败”。免责声明:我没有尝试过您考虑的基准测试。我有兴趣看看它是否会起作用。

    要记住的一件事是,如果不使用 $or,您将无法在每个查询中使用多个索引,这是 mongodb 中的当前限制。 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-Oneindexperquery.

    【讨论】:

    • 你的意思是没有办法同时搜索多个部分索引的字段?
    • 好吧,你可以,使用 $or -- 你的查询模式会是什么样子?
    • 此外,您可以搜索多个索引,但它会选择一个索引来使用并扫描其余索引(如果您正在寻找快速结果,这显然是不可取的)。
    • 谢谢,我阅读了参考资料。奇怪的是,我在一个 8 字段查询中测试了这个,速度杀死了 PostgreSQL 和 SQL Server。然而,正如您所说,一个查询一次只能使用一个索引。
    • 是的,根据我的经验,多个范围查询是 mongo 的一个弱点(即使在范围内的所有字段上都有索引)。您可能会为这个(但未计划的)问题投票,这可能会提高您的用例的性能。 jira.mongodb.org/browse/SERVER-785
    【解决方案2】:

    在服务器中实现之前,您可以运行两次 OR 查询 - 每个字段一次并在客户端合并结果。

    例如,如果您有对象:

    {_id: 123, foo: 12}
    {_id: 124, bar: 13}
    {_id: 124, foo: 12, bar: 15}
    

    您可以拥有一个稀疏索引{foo:1, _id:1} 和另一个{bar:1, _id:1},并执行find({foo:12}, {_id:1})find({bar:13}, {_id:1}) 之类的查询,然后在客户端中对对象ID 进行OR 或AND。然后,您可以仅检索那些匹配 ID 的完整对象。

    注意:通过在 find 查询中仅检索 _id 字段,Mongo 可以从索引中返回结果,而无需解压任何 BSON 即可提供结果,从而使这非常快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-22
      • 2013-06-12
      • 2018-06-12
      • 1970-01-01
      • 1970-01-01
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多