Php MongoDB:模式迁移、更新或插入

Php MongoDB:模式迁移、更新或插入,php,mongodb,Php,Mongodb,虽然MongoDB不需要任何固定模式,但有时我们希望从一种结构迁移到另一种结构 我最近处理了一个小数据集(~200K),决定循环现有数据,转换数据模型并插入到新集合中。事实证明,我们的vps并没有那么强大,在确保以下几点后,使用php驱动程序,我只能达到大约300次插入/秒: 插入前没有索引 尽可能多地使用批插入 我想知道我是否只是选择了错误的迁移路径,或者在MongoDB中处理模式更改时是否有一些最佳实践 在采纳了一些建议之后,我在迁移期间将写关注点更改为0,这是我观察到的: 插入速度

虽然MongoDB不需要任何固定模式,但有时我们希望从一种结构迁移到另一种结构

我最近处理了一个小数据集(~200K),决定循环现有数据,转换数据模型并插入到新集合中。事实证明,我们的vps并没有那么强大,在确保以下几点后,使用php驱动程序,我只能达到大约300次插入/秒:

  • 插入前没有索引
  • 尽可能多地使用批插入
我想知道我是否只是选择了错误的迁移路径,或者在MongoDB中处理模式更改时是否有一些最佳实践


在采纳了一些建议之后,我在迁移期间将写关注点更改为0,这是我观察到的:

  • 插入速度仍然不如预期的快,最大插入速度约为500次/秒
  • 插入完成后,索引会很快完成,这可能是因为
    ensureIndex
    是fire and forget with
    w=0
  • 剩余的更新需要一段时间才能启动,可能是因为索引操作被阻塞了?然后,它似乎以不同的速度运行(以前一直运行得比较慢),再次可能是索引正在发生
  • CPU和IO都很好。cpu的空闲率大多在90%左右,IO等待率不到10%

除了不使用我们的PHP ORM进行迁移外,还有更多的优化可能性吗?

在PHP客户端之间传输和序列化所有内容可能会增加很多开销。从shell运行迁移将是最快的。使用或使用游标进行迭代并调用

请参见使用光标的示例(朝向底部)


注意游标的问题。如果集合没有切分,可能需要幂等更新或使用快照。

可以使用shell本身的.update()更改模式吗?将集合的内容转储到另一个集合中,然后执行更新查询?您使用的WriteConcern是什么?在这样的迁移脚本中,如果您当前使用的是“副本已确认”之类的更安全的工具,那么您应该能够通过“未确认”来获得不错的性能提升。使用另一个驱动程序进行至少一个小测试是否太难?我不太熟悉php驱动程序,但我在Mac电脑上使用Python做了类似的事情(无论如何,这是一个非常好的应用),我能够在5秒钟内更新/插入10.000,而且我不必对脚本进行太多优化。对于在几个小时内编写的脚本来说,每秒2000次似乎是一个非常好的性能。第一步应该确定是CPU利用率(PHP本身)还是写入吞吐量(MongoDB服务器)阻碍了您。您可以使用类似于
top
的工具来观察PHP进程,
mongostat
可以用来观察服务器活动和写锁。有趣的是,我可以说PHP确实能够使用未确认的写关注点(
w=0
)每秒推送10k+更新。使用默认的写入关注点(
w=1
),数据库操作之间的往返肯定是一个限制因素。thx根据您的建议,
w=0
是一个疏忽。虽然在改变了选项之后,它似乎仍然比大多数人认为的要慢。当然不会超过1k/秒,而且我们的vps cpu和磁盘在测试期间表现良好。我想知道这是否仅仅是我们的php应用程序(使用orm与mongodb接口)中的开销。