MongoDB多个索引与子文档数组上的单个索引?

时间:2011-10-23 20:53:51

标签: mongodb indexing mongodb-.net-driver

想知道哪种方法可以更有效地索引我需要跟踪的文档的各种时间戳,请记住我的应用程序在编写时相当繁重,但是如果没有索引,那么查询也很重要慢。

为每个时间戳设置一个字段并为每个字段编制索引,或者将时间戳及其相关类型存储在数组字段中,并为该数组的每个字段编制索引是否更好?

第一个选项,单独的字段和每个字段的索引:

{
    "_id" : "...",
    "Field1.Timestamp" : '2011-01-01 01:00.000',
    "Field2.Timestamp" : '2011-01-01 01:00.000',
    "Field3.Timestamp" : '2011-01-01 01:00.000',
    "Field4.Timestamp" : '2011-01-01 01:00.000',
    "Field5.Timestamp" : '2011-01-01 01:00.000',
    "Field6.Timestamp" : '2011-01-01 01:00.000',
    "Field7.Timestamp" : '2011-01-01 01:00.000',
    "Field8.Timestamp" : '2011-01-01 01:00.000',
    "Field9.Timestamp" : '2011-01-01 01:00.000',
}

db.mycollection.ensureIndex({ "Field1.Timestamp" : 1 });
db.mycollection.ensureIndex({ "Field2.Timestamp" : 1 });
db.mycollection.ensureIndex({ "Field3.Timestamp" : 1 });
db.mycollection.ensureIndex({ "Field4.Timestamp" : 1 });
db.mycollection.ensureIndex({ "Field5.Timestamp" : 1 });
db.mycollection.ensureIndex({ "Field6.Timestamp" : 1 });
db.mycollection.ensureIndex({ "Field7.Timestamp" : 1 });
db.mycollection.ensureIndex({ "Field8.Timestamp" : 1 });
db.mycollection.ensureIndex({ "Field9.Timestamp" : 1 });

然后是一个时间戳及其状态的数组,只有一个索引

{
    "_id" : "...",
    "Timestamps" : [
        { "Type" : "Field1", "Timestamp" : '2011-01-01  01:00.000' },
        { "Type" : "Field2", "Timestamp" : '2011-01-01  01:00.000' },
        { "Type" : "Field3", "Timestamp" : '2011-01-01  01:00.000' },
        { "Type" : "Field4", "Timestamp" : '2011-01-01  01:00.000' },
        { "Type" : "Field5", "Timestamp" : '2011-01-01  01:00.000' },
        { "Type" : "Field6", "Timestamp" : '2011-01-01  01:00.000' },
        { "Type" : "Field7", "Timestamp" : '2011-01-01  01:00.000' },
        { "Type" : "Field8", "Timestamp" : '2011-01-01  01:00.000' },
        { "Type" : "Field9", "Timestamp" : '2011-01-01  01:00.000' },
    ]
}

db.mycollection.ensureIndex({ "Timestamps.Type" : 1, "Timestamps.Timestamp" : 1 });

我是不是在这里?或哪种方式更好

1 个答案:

答案 0 :(得分:2)

这基本上归结为如果10个大小为N的索引比一个大小为N * 10的索引更有效。如果你纯粹看看读取那么单独的索引应该总是更快。相关的b树遍历将检查较小的密钥集等。

但有几点需要考虑:

  • 数组字段上的索引基本上单独索引每个数组元素。因此,在b树行走期间,查找开销最多将是1-2个额外步骤,这是可忽略的性能损失。换句话说,它们几乎一样快。
  • 拥有10个索引可能意味着每个更新/插入都需要更新多个索引(取决于您的索引是否共享一个字段,或者您是否一次更新多个时间戳)。这是一个重要的性能考虑因素。
  • 使用数组索引可以更轻松地添加其他时间戳(例如Timestamp10)。
  • 每个数据库可以使用的命名空间数量限制(24k),每个索引占用一个。如果您为每个字段创建一个单独的索引,这可能会成为一个问题。
  • 最重要的是,数组索引更直接,可以简化代码,从而简化可维护性。鉴于性能差异有限,我认为这是在这里采用数组索引的最强烈动机。