复合指数和单一指数

时间:2013-09-12 16:05:25

标签: mongodb indexing compound-index

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

我看到它的方式,我有两种选择。

一个。

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})

显然,选项A是一个更好的选择(你希望稍后在索引中具有低唯一性的字段)与选项B.为什么会这样?

但是,同时MongoDB文档声明如果您的索引增加the whole index need not fit in RAM。如果这是一个非常重写的应用程序,那么B会是更好的选择吗? (复合指数大于单个索引,复合指数增加而不是A不增加)

1 个答案:

答案 0 :(得分:1)

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

同样,如果您总是通过最近的ReceiveTime查询,那么可以使用{ReceiveTime:1,SerialNumber:1}保持工作集较小。您只需要将与最新ReceiveTime相对应的页面保留在内存中。这就是您链接到的文档所暗示的内容。