在使用 MongoDB 的应用程序中,何时/何地是进行关系数据库中迁移的数据库更改的最佳位置?
比如创建索引或者设置shard key应该如何管理?这段代码应该去哪里?
最佳答案
最好有意识地在 shell 中执行此操作!因为如果您不小心在错误的时间和错误的实例上启动这样的命令,可能会造成严重破坏。
最重要的是:如果您在现有数据库上添加索引,在额外的从属实例上离线执行此操作!对于大型数据集,建立索引可能需要数小时,甚至数天!
另见:
http://www.mongodb.org/display/DOCS/Indexes
http://www.javabeat.net/articles/print.php?article_id=353
http://www.mongodb.org/display/DOCS/Indexing+as+a+Background+Operation
http://nosql.mypopescu.com/post/1312926692/mongodb-indexes-and-indexing
如果您有一个大型数据集,请务必仔细阅读去年的 4square 中断..!!
http://www.infoq.com/news/2010/10/4square_mongodb_outage
http://blog.foursquare.com/2010/10/05/so-that-was-a-bummer/
不想将索引放入脚本或某种配置文件的主要原因之一是在 MongoDB 中索引操作是阻塞的(!)——这意味着 MongoDB 将停止对数据库的其他操作,直到索引完成。想象一下代码中的无害更改,需要一个新索引来提高性能——这个更改被粗心地 checkin 并部署到生产环境中……突然间,您的生产环境 MongoDB 正在为您的应用程序服务器加速,因为 MongoDB 是在做任何其他事情之前在内部添加新索引first... outch!显然这已经发生在一些人身上,这就是为什么他们在 MongoDB session 上不断提醒人们要小心不要“以编程方式”要求索引。
新版本的 MongoDB 允许后台索引——你应该总是这样做,例如db.yourcollection.ensureIndex(..., {background: true})
否则,会发生不那么有趣的事情:
关于mongodb - 配置 MongoDB "schema"的最佳实践时间/地点是何时/何地?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654907/