【问题标题】:Minimum # of Compound Indexes复合索引的最小数量
【发布时间】:2013-09-25 21:03:26
【问题描述】:

考虑 Mongo 的 Compound Indexing 示例:

Example Given the following index:
{ "item": 1, "location": 1, "stock": 1 }
MongoDB can use this index to support queries that include:   

 - the item field, and
 - the item field and the location field, and
 - the item field and the location field and the stock field.

MongoDB cannot use this index to support queries that include:


 - only the location field,
 - only the stock field,
 - only the location and stock fields, and
 - only the item and stock fields.

是否有比简单的排列更好的最小#索引来支持商品、位置和库存的任何“精确匹配”查询组合?

编辑

为了解决上面缺少的索引,我可以添加LocationStockLocation-StockItem-Stock 索引。请注意,最后 2 个是复合索引,用于处理我的问题中列出的所有查询。

但是,在尝试处理 N 个字段的所有排列时是否有一般规则?

【问题讨论】:

  • 你不能解决这个问题吗?看起来很简单,你只是想让我们为你做数学
  • 根据您的适当指责编辑,Sammaye。谢谢你。
  • 不要以这种方式存储数据——您需要存储更多的“键/值/类型”,以可能减少可能需要的索引排列数量。
  • @WiredPrairie,请进一步解释。我不关注。
  • 我也没有。 :) 作为我正在考虑的解决方案的一部分,我在脑海中混合了另一个数据库的功能,形成了一种邪恶/不可能的混合。所以,没关系。

标签: mongodb indexing


【解决方案1】:

我可以添加LocationStockLocation-StockItem-Stock 索引。请注意,最后 2 个是复合索引,用于处理我的问题中列出的所有查询。

如果您有Location-Stock,则不需要单独的Location 索引。

您可能想观看MongoDB's Jira for updates on index intersection。索引交集将解决这个问题。 new matcher 已经在 2.5 分支中。

一般来说,加入(几乎)所有排列是不可行的,因为排列的数量是 N!,所以 4 个字段有 24 个索引,5 个字段有 120 个索引。

确保您的索引 选择性 良好。这在很大程度上取决于数据(即关系的分布方式)和应用程序(您需要的查询),这使得讨论变得棘手。

例如,假设一个典型的客户有 5,000 件库存商品,但没有人拥有超过 5 个位置。在这种情况下,location 索引可能不会有太大帮助。最坏的情况是查询特定位置的所有项目。数据库必须查看 25k 个文档才能返回 5k 个结果。

这不是太有效,但用户不太可能想要经常查询整个列表。对于您只想显示第一页的典型应用程序,此查询的有效性将取决于插入顺序和主键的类型:如果文档具有随机键,则数据库将不得不扫描 5n平均返回n 结果的文档。但是,如果主键是单调的并且数据是逐个位置插入的,那么数据库可能必须扫描并跳过 20k 个元素才能找到第一个结果!

所以,长答案是:索引是一种工具,必须根据您需要的数据和查询进行仔细调整,因此不存在有助于实际目的的普遍适用的最低限度。

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多