php Mongo驱动程序游标移动耗时太长

php Mongo驱动程序游标移动耗时太长,php,mongodb,Php,Mongodb,我有一个这样的问题 $results = $collection->find([ 'status' => "pending", 'short_code' => intval($shortCode), 'create_time' => ['$lte' => time()], ]) ->limit(self::BATCH_NUMBER) ->sort(["priority"

我有一个这样的问题

$results = $collection->find([
        'status'      => "pending",
        'short_code'  => intval($shortCode),
        'create_time' => ['$lte' => time()],
    ])
    ->limit(self::BATCH_NUMBER)
    ->sort(["priority" => -1, "create_time" => 1]);
其中批次大小为70

我使用如下查询结果:

foreach ($results as $mongoId => $result) {
}
.sort({priority : -1, create_time : 1});
或尝试转换为数组,如:

iterator_to_array($results);
mongo获取数据并在迭代时间上移动是:

FetchTime: 0.003173828125 ms
IteratorTime: 4065.1459960938 ms
如您所见,mongo获取数据的速度太快,但迭代(在使用迭代器_to_数组或使用foreach的情况下)速度很慢

它是用于向另一台服务器发送消息的队列。目标服务器每个请求接受的文档少于70个。所以我不得不去拿70份文件。无论如何我想从1300000份文件中提取70份文件,我们这里有问题。 query尝试获取具有查询条件的前70个文档,发送它们,最后从集合中删除它们

有人能帮忙吗?为什么要花很长时间?或者是否有用于php或mongo加速的配置


另一方面,当数据总量达到100000(1300000)时,传输速度很快。旅行时间将随着文档总数的增加而增加。

这是因为排序

问题是: 从mongo获取数据速度很快,但使用foreach在迭代器中运行很慢

解决方案: 有一种是我们用的。按优先级描述排序并创建时间ASC。这些文件分别为ASC索引。索引优先级描述和创建时间ASC一起修复了问题

db.queue_1.createIndex( { "priority" : -1, "create_time" : 1 } )
索引时文件的顺序很重要。意味着您应该首先使用优先级。然后使用创建时间。 因为当您尝试对查询进行排序时,您会按如下方式对其进行排序:

foreach ($results as $mongoId => $result) {
}
.sort({priority : -1, create_time : 1});

实际返回了多少个结果?在4秒钟的时候,我想这不是一个小数目。也许你应该考虑,而不是返回这么多的结果,你可能实际上需要一些东西来“减少”服务器上的结果集。所以你需要提供一些背景。作为实际返回的结果的数量,如果这是一个很大的数字(如1000),那么您应该解释为什么需要返回1000个结果,以及您打算如何处理这些结果。我需要1300000个文件中的70个文件。实际上我的批号是70。正如您所看到的,从mongo抓取很快。在结果之间穿梭是个问题,这就是你的问题。你究竟为什么需要循环浏览130万份文档才能取出70份?这就是“查询”条件的用途。因此,如果有其他逻辑确定
70
,则需要在服务器上执行。您如何确定实际需要的
70
?通过编辑问题并解释处理光标的代码实际执行的操作,将详细信息包含在问题中。