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

sla*_*acy 4 mongodb

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

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

Jus*_*ins 8

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

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

> db.system.indexes.find();
Run Code Online (Sandbox Code Playgroud)

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

> db.things.getIndexes();
Run Code Online (Sandbox Code Playgroud)

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

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

> db.things.ensureIndex({x:1}, {background:true});
Run Code Online (Sandbox Code Playgroud)

不过请注意......

...后台模式构建使用增量方法来构建比默认前台模式慢的索引:构建索引的时间会更长.

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