在使用MongoDB的应用程序中,何时/何地是进行数据库更改的最佳位置,这些更改将在关系数据库中进行迁移?
例如,如何管理创建索引或设置分片键?这段代码应该放在哪里?
答案 0 :(得分:2)
最好在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将停止对数据库的其他操作继续进行直到索引已完成。想象一下代码中的一个无辜的变化,需要一个新的索引来提高性能 - 这种变化是不经意间检入并部署到生产中......突然之间你的生产MongoDB正在为你的app-server付费,因为MongoDB是在做其他任何事情之前,在内部添加新索引第一 ... outch!显然这已经发生在几个人身上,这就是为什么他们不断提醒MongoDB会议的人要小心不要“以编程方式”要求索引。
MongoDB的新版本允许后台索引 - 你应该总是这样做,例如db.yourcollection.ensureIndex(...,{background:true})
否则,会发生不那么有趣的事情: