考虑一下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.
是否需要更好的最低#索引才能支持项目,位置和库存的任何“完全匹配”查询组合,而不仅仅是排列?
修改
要解决上面缺少的索引,我可以添加Location
,Stock
,Location-Stock
和Item-Stock
索引。注意最后2个是复合索引来处理我的问题中列出的所有查询。
但是,在尝试处理N个字段的所有排列时是否有一般规则?
答案 0 :(得分:0)
我可以添加
Location
,Stock
,Location-Stock
和Item-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元素才能找到第一个结果!
因此,答案很长:索引是一个必须根据您需要的数据和查询仔细调整的工具,因此通常没有适用于实际目的的最小边界。