2011-02-11 58 views
3

这个代码大约需要0.1秒PHP蒙戈的光标速度很慢

// find 
$benchmark = Profiler::start ('Testing', 'find()'); 
$cursor = MongoBG::getInstance ()->setDatabase ('test')->setCollection ('testcoll')->find(); 
Profiler::stop ($benchmark); 

$benchmark = Profiler::start ('Testing', 'cursor walk'); 
while ($cursor->hasNext()) { 
    print_r($cursor->getNext()); 
} 
Profiler::stop ($benchmark); 

因此“找到()”只用了0.000017秒 但“光标游走”0.102812秒

收集大约是100行,速度与1000个或仅10个项目相同。

某些服务器信息: 的FreeBSD 8.1,PHP 5.3.5与(蒙戈/ 1.1.4),MongoDB的版本1.6.6预

+0

@mika:我非常怀疑它需要0.0005s的Python连接到数据库并检索结果。上述测试不具代表性。 – johndodo 2011-12-19 12:00:54

回答

4

有了这么快的时间,这听起来像find没做除了准备一个对象(没有与数据库通信)之外,只有在使用游标时才会执行实际查询并读取结果。光标正在做这个工作,这就是为什么它慢。

我知道这就是node.js的mongodb驱动程序的工作原理。如果你这样看,光标速度对于打开连接,验证,发送查询,接收和缓冲响应,然后将其解析/加载到对象中以返回给你来说并不是那么糟糕。

+0

“可能”这个词是不需要的...... :)确实如此。函数find()本身不做任何事情,否则这将会非常低效:`$ collection-> find() - > limit(10);`。 +1关于速度的说明 - 基准不绘制正确的图片(因为它包括连接建立时间)。 – johndodo 2011-12-19 11:50:59