首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当查询在两个索引之间使用‘an’和一个数组时,有什么区别?

当查询在两个索引之间使用‘an’和一个数组时,有什么区别?
EN

Stack Overflow用户
提问于 2019-05-15 04:26:01
回答 1查看 30关注 0票数 1

MongoDB中包含如下文档的集合:

代码语言:javascript
复制
{a: 1, b: 1}
{a: 2, B: 2}
{a: 3, B: 3}
{a: 3, B: 2}
{a: 2, B: 1}

使用uniq索引a_1_b_1b_1_a_1

查询:{a: x, b: { $in: [....] } }

哪个指数更好?还是一样的?

查询匹配数组如何工作?

更新:碎片键会影响查询索引吗?切分键:a_1_c_1额外索引:b_1_a_1查询:{a: x, b: y}

  1. 通过a=x将切分键a_1_c_1路由到碎片,然后使用索引b_1_a_1在碎片中查询
  2. 按切分键路由和查询必须使用切分密钥?
EN

回答 1

Stack Overflow用户

发布于 2019-05-15 05:17:38

来自MongoDB手册关于复合指标的一节

db.products.createIndex( {“项目”:1,“股票”:1})复合索引中列出的字段的顺序非常重要。索引将包含对文档的引用,这些文档首先根据项目字段的值排序,而在项目字段的每个值中,则根据库存字段的值进行排序。

鉴于以上所述,我们可以看到,a_1_b_1将首先由a分割,然后由b分割,而b_1_a_1将首先由b分割,然后由a分割。

现在让我们检查一下您的查询:{a: x, b: { $in: [....] } }

请注意,此查询匹配特定的a值和一系列可能的b值。在索引a_1_b_1中,索引扫描将仅限于匹配的a块,并且将在其中搜索所有b值;但是,如果使用索引b_1_a_1,则索引扫描必须在不同的b块之间“跳转”,并搜索每个块以查找匹配的a值。

访问“接近”的数据通常效率要高得多,因此您需要选择匹配文档更有可能位于其中的索引。在这种情况下,将所有文档放在同一个a块中可能是一个更好的选择,因为应该减少“跳跃”,所以应该使用索引a_1_b_1

然而,这是过于简单化的。实际的性能影响可以忽略不计,特别是在可能的ab范围很小的情况下。

还有一个额外的考虑:查询前缀。如果您发现自己有时只使用a值执行查询,则应该选择索引a_1_b_1。同样,如果有时只使用b值执行查询,则应该选择b_1_a_1

这是因为如果查询不完全匹配索引,而是匹配该索引的前缀,则索引仍然适用。因此,在索引a_1_b_1中,可以对{a: x, b: {$in: [....]}}{a: x}执行有效的查询,但不能对{b: {$in: [....]}}执行有效的查询。

最后,通常还可以利用指数相交拥有两个独立的索引a_1b_1,在性能和灵活性之间提供了一个中间地带。

考虑到上面的所有内容,在数据的大小开始需要之前,我建议不要过多地关注索引性能。毕竟,您可以根据需要删除旧索引并构建新索引。使用现在起作用的东西,随着时间的推移监视性能,并重新评估可能会超过当前使用的增长速度。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56141763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档