mongodb -涉及一个公共字段的多个复合索引

o8x7eapl  于 2022-12-22  发布在  Go
关注(0)|答案(1)|浏览(125)

我们有一个包含数百万数据的集合。这些数据将在UI中呈现以用于统计目的,因此呈现时间至关重要。
呈现数据的查询涉及以下字段:
1.字段_a和字段_t
1.字段B和字段t
1.字段c和字段t
当我们查询数百万的数据时,我们希望使用复合索引来加快查询速度。
为此,我们可以简单地添加3个不同的复合指数如下:

db.mycollection.createIndex( { "field_a": 1, "field_t": 1 }
db.mycollection.createIndex( { "field_b": 1, "field_t": 1 }
db.mycollection.createIndex( { "field_c": 1, "field_t": 1 }

创建索引时遵循ESR规则,因为field_a、field_B和field_c是相等性检查,field_t是范围检查。请注意,field_t在所有3个索引中是通用的。
除了创建3个不同的索引,还有更好的方法吗?
mongo是否提供了一种更有效的方法来处理在多个复合索引中使用同一字段的情况?

kkih6yb8

kkih6yb81#

在哪些方面更好或更有效率?
就查询性能而言,拥有您提到的三个索引是最有效的方法。它们将允许数据库仅处理与每个查询相关的数据,而不处理其他数据。任何其他方法都会降低读取效率(和速度),这可能不是一个好的折衷方案。
大多数数据库,包括MongoDB,通常在执行查询时使用单个索引。这主要是索引工作方式的结果。通常索引使用类似B树的数据结构,这是一个有序的信息集。当遵循ESR规则时(将相等条件置于范围条件之前),特定查询的所有信息都包含在索引中的单个有界子树中,该子树可以被直接遍历。如果索引不是以这种方式构造的(包括将范围键放在第一位),它将失去这样做的能力。
使用单字段索引的其他潜在方法如下:

  • 索引交集--在这里您创建(在本例中)4个单字段索引,并让数据库为每个查询使用2个索引。MongoDB通常不经常选择这种方法,因为与上面的复合索引方法相比,它会导致扫描索引的更大部分。
  • 对每个查询使用1个单字段索引-数据库最终将检索文档以过滤其他字段,这可能是非常低效的,这取决于其他字段的选择性。

虽然这些方法可能会减小集合索引的总体大小,但会增加执行查询的成本(并降低效率)。根据优化的目的,您概述的方法将被视为查询效率方面的最佳实践。

相关问题