MongoDB初始部署和索引

时间:2012-11-15 17:40:12

标签: mongodb indexing mongodb-php

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

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

对此有任何最佳做法建议吗?

2 个答案:

答案 0 :(得分:2)

不确定这是否是最佳做法,但我倾向于不在应用中添加ensureIndex。我通常使用db shell来确定我需要的那些。然后我在负载测试期间(或者当生产中的东西开始减速时)留意并添加我在shell中再次错过的任何东西。您可以通过执行ensureIndex({a:1},{background:true})在后台构建索引,因此稍后构建它们并不像其他dbs那样糟糕。

MongoDB有一个很好的分析器可以找到变慢的内容:http://www.mongodb.org/display/DOCS/Database+Profiler

10gen(MongoDB的商业对手)有一个免费的监控服务,虽然我还没有使用它,但我已经谈了很多:http://www.10gen.com/mongodb-monitoring-service

但是,在创建集合之前调用db.collection.ensureIndex()时会发生什么,它将创建集合并将索引放在其上。

如果你肯定想在应用程序中使用它,我会选择你提出的第二个选项(确保db连接后的索引)而不是每个操作之前。我可能会在db中保存一些东西,所以如果有多个,我们不会每次都运行它们。不知道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项

答案 1 :(得分:1)

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

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