使用 Mongo:我们应该为每种类型的大容量查询创建一个定制的索引吗?
Posted
技术标签:
【中文标题】使用 Mongo:我们应该为每种类型的大容量查询创建一个定制的索引吗?【英文标题】:Using Mongo: should we create an index tailored to each type of high-volume query? 【发布时间】:2013-03-27 00:49:07 【问题描述】:我们有两种类型的高容量查询。查找涉及 5 个属性的文档:日期 (lte)、存储在数组中的值、存储在第二个数组中的值、一个整数 (gte) 和一个浮点数 (gte)。
第二个包括这五个属性加上另外两个。
我们是否应该创建两个复合索引,每个查询一个?假设每个属性都有一个高基数。
如果我们这样做,因为每个查询都涉及多个数组,由于 Mongo 的限制,我们似乎无法创建索引。在这种情况下,人们如何构建他们的 Mongo 数据库?
我们正在使用 MongoMapper。
谢谢!
【问题讨论】:
【参考方案1】:在查询中的第一个范围之后的查询索引附加索引字段的值显着下降。
从概念上讲,我发现最好考虑索引中的附加字段,以便从查询中修剪更小的子树。第一个范围切断一个大分支,第二个更小,第三个更小,依此类推。我的一般经验法则是索引中查询的第一个范围是有价值的。
对该规则的警告是,索引中的其他字段可能有助于对返回的结果进行排序。
对于第一个查询,我将在两个数组值上创建一个索引,然后哪个范围将排除最多的文档。除非您可以关闭范围(lte 和 gte),否则日期字段不太可能提供高度排除。整数和浮点数在不知道域的情况下很难分辨。
如果第二个查询的两个附加属性也在查询中使用范围并且没有明显更高的排除值,那么我将只使用一个索引。
罗伯。
【讨论】:
以上是关于使用 Mongo:我们应该为每种类型的大容量查询创建一个定制的索引吗?的主要内容,如果未能解决你的问题,请参考以下文章
GraphQL:每种类型的子字段与可以使用 args 过滤的根查询字段?