MongoDB中包含如下文档的集合:
{a: 1, b: 1}
{a: 2, B: 2}
{a: 3, B: 3}
{a: 3, B: 2}
{a: 2, B: 1}使用uniq索引a_1_b_1或b_1_a_1
查询:{a: x, b: { $in: [....] } }
哪个指数更好?还是一样的?
查询匹配数组如何工作?
更新:碎片键会影响查询索引吗?切分键:a_1_c_1额外索引:b_1_a_1查询:{a: x, b: y}
a=x将切分键a_1_c_1路由到碎片,然后使用索引b_1_a_1在碎片中查询发布于 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。
然而,这是过于简单化的。实际的性能影响可以忽略不计,特别是在可能的a和b范围很小的情况下。
还有一个额外的考虑:查询前缀。如果您发现自己有时只使用a值执行查询,则应该选择索引a_1_b_1。同样,如果有时只使用b值执行查询,则应该选择b_1_a_1。
这是因为如果查询不完全匹配索引,而是匹配该索引的前缀,则索引仍然适用。因此,在索引a_1_b_1中,可以对{a: x, b: {$in: [....]}}和{a: x}执行有效的查询,但不能对{b: {$in: [....]}}执行有效的查询。
最后,通常还可以利用指数相交拥有两个独立的索引a_1和b_1,在性能和灵活性之间提供了一个中间地带。
考虑到上面的所有内容,在数据的大小开始需要之前,我建议不要过多地关注索引性能。毕竟,您可以根据需要删除旧索引并构建新索引。使用现在起作用的东西,随着时间的推移监视性能,并重新评估可能会超过当前使用的增长速度。
https://stackoverflow.com/questions/56141763
复制相似问题