2012-11-15 32 views
2

我正在做我的第一個使用MongoDB的項目,並且從我所看到的隱式創建集合是推薦的做法(即db.myCollection.insert()將在第一次創建集合一個插入)MongoDB初始部署和索引

我正在使用PHP並使用不同的集合這種方式,但問題是,我不知道應該在哪裏創建索引,我需要該集合。由於我不知道什麼時候創建了一個集合,所以在這個集合的每一個操作之前,這個天真的方法都會調用ensureIndex()(這聽起來不太好)。或者每當建立到數據庫的連接時,確保存在索引(如果我在未創建的集合上創建索引會發生什麼情況?是否定義了?)

任何有關此最佳實踐的建議?

回答

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

其實,ensureIndex()正是你需要做的。我會在每個模型的構造函數中使用特定的連接來實現 - 如果您有其中一個模型)。 ensureIndex()將確保只在索引不存在時才創建索引。您可以選擇在創建數據庫連接時執行此操作。如果在一個不存在的集合上運行ensureIndex(),它只會創建該集合並創建空索引(因爲還沒有文檔)。

在未來,PHP驅動程序也將緩存是否ensureIndex()在相同的請求已經運行,基本上使其成爲一個無操作:https://jira.mongodb.org/browse/PHP-581