当索引已经存在时,ensureIndex({field:1})的开销是多少?

时间:2011-01-03 23:30:39

标签: mongodb

我希望始终确保我的馆藏已编入索引,并且我会在半定期的基础上添加和删除它们。

假设我在每个Web请求时都与DB建立了新的连接,每次连接时都可以执行一些db.collection.ensureIndex({field:true})语句吗?

1 个答案:

答案 0 :(得分:8)

据我了解,MongoDB只是查询系统Collection,以便在创建索引之前查看索引是否存在...

http://www.mongodb.org/display/DOCS/Indexes#Indexes-AdditionalNotesonIndexes

> db.system.indexes.find();

您可以运行getIndexes()来查看Collection的索引

> db.things.getIndexes();

所以,你只需添加一个查询;它不会重建它或做任何其他不明显的事情。

那就是说,我认为这不是一个特别好的主意。它会增加不必要的开销,更糟糕的是可能会在创建索引时锁定数据库...因为默认情况下创建索引会阻塞数据库(除非你在后台运行它),如下所示:

> db.things.ensureIndex({x:1}, {background:true});

然而请注意......

  

...背景模式构建使用了   增量方法来构建   索引比默认值慢   前台模式:构建时间   指数会更大。

我认为,当您 添加集合 而不是每次连接到数据库时,在代码中执行此操作会更好。无论如何你为什么要添加和删除它们?