0

我要索引的文档中有两个字段。其中之一是接收时间,另一个是序列号。我希望用户能够单独查询序列号或同时查询序列号和接收时间。

在我看来,我有两个选择。

一个。

db.collection.ensureIndex({SerialNumber: 1, ReceiveTime: 1}) db.collection.ensureIndex({ReceiveTime: 1})

B.

db.collection.ensureIndex({ReceiveTime: 1, SerialNumber: 1}) db.collection.ensureIndex({SerialNumber: 1})

显然,与选项 B 相比,选项 A 是更好的选择(您希望稍后在索引中出现唯一性较低的字段)。为什么会这样?

但是,同时 MongoDB 文档指出,如果您的索引增加,则整个索引不需要适合 RAM。如果这是一个写入量很大的应用程序,那么 B 会是更好的选择吗?(复合索引大于单个索引,复合索引递增,而不是 A 不递增)

4

1 回答 1

1

{SerialNumber: 1, ReceiveTime: 1} 和 {ReceiveTime: 1, SerialNumber: 1} 之间的决定应基于您计划执行的查询类型。如果您通常查询特定的 SerialNumber 但可能的 ReceiveTimes 范围很大,那么您希望使用 {SerialNumber: 1, ReceiveTime: 1}。相反,如果您的查询是针对 ReceiveTime 的,但对 SerialNumber 来说更通用,那么请选择 {ReceiveTime: 1, SerialNumber: 1}。这样,每个查询可能需要更少的索引页,并将最小化操作系统必须执行的交换量。

类似地,如果您总是通过最近的 ReceiveTimes 进行查询,那么您可以使用 {ReceiveTime: 1, SerialNumber: 1} 来保持工作集较小。您只需将与最近的 ReceiveTimes 对应的页面保留在内存中。这就是您链接到的文档所建议的内容。

于 2013-09-16T21:28:18.787 回答