复合索引的最小数量

时间:2013-09-25 21:03:26

标签: mongodb indexing

考虑一下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个字段的所有排列时是否有一般规则?

1 个答案:

答案 0 :(得分:0)

  

我可以添加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索引可能没有太大帮助。最糟糕的情况是查询特定位置的所有项目。 DB必须查看25k文档才能返回5k结果。

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

因此,答案很长:索引是一个必须根据您需要的数据和查询仔细调整的工具,因此通常没有适用于实际目的的最小边界。