我在我的代码中在MongoDB服务器上实现了以下序列:1)查询“实体”集合,2)更新“实体”集合和3)查询“csubs”集合.最后一个(查询“csubs”集合)使用$where运算符.
我正在运行一个测试,它每秒执行上述三步序列数百次.作为此测试的前提条件,“csubs”集合为空(即显示集合甚至不显示它).因此,直觉说步骤3)应该是超快的.
我已经使用MongoDB 2.4和MongoDB 2.6完成了测试,使用mongotop获得以下结果(“qatest”是数据库的名称):
MongoDB 2.4.9:
ns total read write
qatest.entities 451ms 189ms 262ms
qatest.csubs 447ms 447ms 0ms
MongoDB 2.6.10:
ns total read write
qatest.csubs 2315ms 2315ms 0ms
qatest.entities 121ms 54ms 67ms
根据这个结果,我有两个问题:
>为什么查询“csubs”这么慢?我理解$where的使用可能有查询成本,但我预计成本与目标集合中要处理的文档数量成正比.但在这种情况下,如果集合不存在,则集合中的文档编号为0.是否存在与$where相关的“bootstraping”成本(例如,创建一个JavaScript VM上下文来执行查询)与查询本身相关并且独立于要查询的集合(及其大小)?
>假设存在这样的引导成本,为什么与MongoDB 2.4和MongoDB 2.6有如此不同?特别是,它在MongoDB 2.6中变得更糟(从性能的角度来看,我理解它应该更先进).在MongoDB 2.6中,服务器JavaScript的工作方式有变化吗?
最佳答案 最后,确认它是由于MongoDB 2.6中发生的“自举”成本,而不是MongoDB 2.4中的成本.有关详细信息,请参阅
the MongoDB JIRA tracker中的此票证.