我有一个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}
但我认为构建这两个索引会占用两个硬盘空间。
那么你有什么好主意吗?
答案 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
}