不确定这是否是最佳实践,但我倾向于不将 ensureIndex 放在应用程序中。我通常会使用 db shell 放置我确定需要的那些。然后我在负载测试期间(或者当生产中的事情开始变慢时)密切关注,并在 shell 中再次添加我错过的任何内容。您可以通过 ensureIndex({a : 1}, {background : true}) 在后台构建索引,因此稍后构建它们并不像其他一些数据库那么糟糕。
MongoDB 有一个很好的分析器可以找到慢的地方:http ://www.mongodb.org/display/DOCS/Database+Profiler 。
10gen(MongoDB的商业对应)有一个免费的监控服务,虽然我还没有使用过,但被谈论很多:http ://www.10gen.com/mongodb-monitoring-service 。
但至于在创建集合之前调用 db.collection.ensureIndex() 会发生什么,它将创建集合并将索引放在上面。
如果您确实希望在应用程序中使用它,我会选择您提出的第二个选项(确保在 db connect 之后立即建立索引),而不是在每次操作之前。当我这样做时,我可能会在数据库中保存一些东西,这样如果有两个以上,它们就不会每次都运行。不知道php,但这里是伪代码:
var test = db.systemChecks.findOne({indexes : true})
if (test == null) //item doesn't exist
{
//do all the ensureIndex() commands
db.systemChecks.insert({indexes : true})
}
如果您以后发现需要更多索引来运行索引,请记住删除 systemCheck 项