不知道這是最好的做法,但我傾向於不要將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項目
來源
2012-11-15 23:22:46
jon