虽然 MongoDB 不需要任何固定模式,但有时我们希望从一种结构迁移到另一种结构。
我最近正在处理一个小数据集(~200K),并决定循环现有数据,转换数据模型并插入到新集合中。事实证明,我们的 vps 并没有那么强大,使用 php 驱动程序,在确保以下内容后,我只能达到约 300 次插入/秒:
我想知道我是否只是选择了错误的迁移路径,或者在处理时是否有一些最佳实践模式改变在 MongoDB 中?
在采纳了一些建议后,我在迁移过程中将 write focus 更改为 0,这是我观察到的:
- 插入仍然没有预期的那么快,最大约为每秒 500 次插入
- 插入完成后,索引进行得非常快,可能是因为
ensureIndex
是一劳永逸的w=0
?
- 剩余的更新需要一段时间才能开始,可能是因为索引操作被阻塞?然后它似乎以不同的速度运行(之前它的运行速度一直较慢),再次可能正在进行索引。
- CPU和IO都很好。 cpu大部分空闲在90%左右,IO等待不到10%。
除了不使用我们的PHP ORM进行迁移之外,是否还有更多的优化可能?
与 php 客户端之间传输和序列化所有内容可能会增加大量开销。从 shell 运行迁移将是最快的。用一个写它们update http://docs.mongodb.org/manual/reference/method/db.collection.update/#db.collection.update或使用光标forEach http://docs.mongodb.org/manual/reference/method/cursor.forEach/#cursor.forEach迭代并调用save http://docs.mongodb.org/manual/reference/method/db.collection.save/.
查看使用游标的示例MongoDB更新数组的多条记录 https://stackoverflow.com/questions/14720734/mongodb-update-multiple-records-of-array(朝向底部)。
意识到snapshot http://docs.mongodb.org/manual/reference/method/cursor.snapshot/游标问题。如果集合未分片,可能需要幂等更新或使用快照。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)