在这种情况下如何在mongodb中建立索引

时间:2014-01-13 06:52:04

标签: mongodb indexing

我有一个mongodb数据库,其中包含以下字段:

{“word”:“ipad”,“date”:20140113,“docid”:324,“得分”:98}

这是docs日志的反向索引(约1.2亿)。

我的系统中有两种查询: 其中之一是:

db.index.find({“word”:“ipad”,“date”:20140113})。sort({“score”: - 1})

此查询在日期20140113中获取单词“ipad”,并按分数对所有文档进行排序。

另一个问题是:

db.index.find({“word”:“ipad”,“date”:20140113,“docid”:324})

加快这两种查询,我应该建立什么索引?

我应该像这样构建两个索引吗?:

db.index.ensureIndex({“word”:1,“date”:1,“docid”:1},{“unique”:true})

db.index.ensureIndex({“word”:1,“date”:1,“score”:1}

但我认为构建这两个索引会占用两个硬盘空间。

那么你有什么好主意吗?

1 个答案:

答案 0 :(得分:0)

您按分数降序排序(.sort({"score":-1})),这意味着您的索引也应该在得分字段上降序,以便它可以支持排序:

db.index.ensureIndex({"word":1, "date":1, "score":-1});

另一个索引看起来很好,可以加快查询速度,但您仍然可以通过在mongo shell中运行.explain()后面的查询来确认。

索引始终是读取性能的空间和写入性能的权衡。当你负担不起空间时,你就无法获得索引而必须处理它。但通常写入性能是一个更大的问题,因为驱动器空间通常很便宜。

但也许你可以保存你拥有的三个索引中的一个。 “等等,三个指数?”是的,请记住,每个集合必须在_id字段上具有唯一索引,该索引在初始化集合时会被隐式创建。

但_id字段不必是自动生成的ObjectId。它可以是你想要的任何东西。如果您有另一个具有唯一性约束的索引并且您没有使用_id字段,则可以将该唯一约束移动到_id字段以保存索引。您的文件将如下所示:

{ _id: { 
     "word":"ipad", 
     "date":20140113, 
     "docid": 324
  },
  "score": 98
}