2

我正在用 MongoDB 做我的第一个项目,从我所见,隐式创建集合是推荐的做法(即 db.myCollection.insert() 将在第一次插入时创建集合)

我正在使用 PHP 并以这种方式使用不同的集合,但问题是我不知道应该在哪里创建该集合所需的索引。因为我不知道何时创建集合,所以天真的方法会在对该集合的每个操作之前调用 ensureIndex() (这听起来不太好)。或者每当建立到数据库的连接时,确保索引存在(如果我在未创建的集合上创建索引会发生什么?定义了吗?)

对此有任何最佳实践建议吗?

4

2 回答 2

2

不确定这是否是最佳实践,但我倾向于不将 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 项

于 2012-11-15T23:22:46.347 回答
1

实际上, ensureIndex() 正是您需要做的。我会在使用特定连接的每个模型的构造函数中执行此操作 - 如果您有其中一个模型)。ensureIndex() 将确保仅在索引不存在时才创建索引。您也可以在创建数据库连接时执行此操作。如果您在不存在的集合上运行 ensureIndex(),它只会创建该集合并创建空索引(因为还没有文档)。

将来,PHP 驱动程序还会缓存 ensureIndex() 是否已经在同一个请求中运行,基本上使其成为无操作:https ://jira.mongodb.org/browse/PHP-581

于 2012-11-15T23:19:37.853 回答