MongoCursor
在某些情况下,我面临着极其缓慢的性能。
$mongoClient = new MongoClient('mongodb://127.0.0.1:27017');
$collection = $mc->mydb->mycollection;
测试1:
for($i=0; $i<1000; $i++)
{
$cursor = $collection->find()->limit(2);
$cursor->next();
}
经过时间:41.78210 秒 [ 24 次操作/秒]
测试2:
for($i=0; $i<1000; $i++)
{
$cursor = $collection->find()->limit(1);
$cursor->next();
}
经过的时间:0.47898 秒 [ 2 088 ops/s ]
测试3:
for($i=0; $i<1000; $i++)
{
$cursor = $collection->find()->limit(2)->batchSize(-2);
$cursor->next();
}
经过时间:0.65439 秒 [ 1 528 操作/秒]
在test1中,无论脚本limit(2)
是否limit(200)
始终执行 24 ops/s;
我用以下方法对其进行了测试:
蒙哥 v2.4.5
php 驱动程序 1.4.0dev 和 1.5.0dev
Debian 6.0.7 和 Ubuntu 12.10
这是php驱动程序中的一些问题吗?
编辑1:
我通过 MongoLog 做了一些记录,得到了有趣的结果:
MongoLog::setLevel(MongoLog::ALL);
MongoLog::setModule(MongoLog::IO);
test1:(限制(N),其中 N > 1)
- 1375693731.5349 - IO(FINE):得到回复
- 1375693731.5350 - IO(FINE):获取光标标题
- 1375693731.5351 - IO(FINE):获取光标主体
- 1375693731.5351 - IO(警告):杀死未完成的游标 63182808988603511
- 1375693731.5352 - IO(FINE):得到回复
- 1375693731.5353 - IO(FINE):获取光标标题
- 1375693731.5726 - IO(FINE):获取光标主体
- 1375693731.5727 - IO(警告):杀死未完成的游标 63182981334616260
- ...
test2: (limit(1), limit(0) 和无限制)
- 1375693866.2663 - IO(FINE):得到回复
- 1375693866.2663 - IO(FINE):获取光标标题
- 1375693866.2663 - IO(FINE):获取光标主体
- 1375693866.2665 - IO(FINE):得到回复
- 1375693866.2665 - IO(FINE):获取光标标题
- 1375693866.2665 - IO(FINE):获取光标主体
- ...
正如您所看到的,当我使用 N(其中 N>1)驱动程序限制查询时,killing unfinished cursor
以及下一次尝试获取光标主体时,它会花费很多时间。
编辑2:
是的,时间只涉及 20 个文档的收集,但是 20K 文档只会影响 limit(0) 和 noLimit,它们会像你说的那样杀死光标。
这是 logLevel:5 的日志。我没有任何线索。
mongodb.log:限制(N)
- 8 月 5 日星期一 14:43:55.292 [conn3] 查询 mydb.mycollection cursorid:1002459676459826 ntoreturn:2 ntoskip:0 nscanned:3 keyUpdates:0 locks(micros) r:84 nreturned:2 reslen:86 0ms
- 8 月 5 日星期一 14:43:55.293 [conn3] killcursors: found 1 of 1
- 8 月 5 日星期一 14:43:55。293 [conn3] killcursors keyUpdates:0 0ms
- 8 月 5 日星期一 14:43:55。332 [conn3] runQuery 称为 mydb.mycollection {}
- 8 月 5 日星期一 14:43:55.333 [conn3] 查询 mydb.mycollection cursorid:1002631131988423 ntoreturn:2 ntoskip:0 nscanned:3 keyUpdates:0 locks(micros) r:84 nreturned:2 reslen:86 0ms
mongodb.log:限制(1)
- 8 月 5 日星期一 14:45:54.899 [conn3] runQuery 称为 mydb.mycollection {}
- 8 月 5 日星期一 14:45:54.899 [conn3] 查询 mydb.mycollection ntoreturn:1 ntoskip:0 nscanned:1 keyUpdates:0 locks(micros) r:39 nreturned:1 reslen:53 0ms
- 8 月 5 日星期一 14:45:54.899 [conn3] runQuery 称为 mydb.mycollection {}
- 8 月 5 日星期一 14:45:54.899 [conn3] 查询 mydb.mycollection ntoreturn:1 ntoskip:0 nscanned:1 keyUpdates:0 locks(micros) r:35 nreturned:1 reslen:53 0ms