我有这样的查询
$results = $collection->find([
'status' => "pending",
'short_code' => intval($shortCode),
'create_time' => ['$lte' => time()],
])
->limit(self::BATCH_NUMBER)
->sort(["priority" => -1, "create_time" => 1]);
BATCH_SIZE为70。
我使用如下查询结果:
foreach ($results as $mongoId => $result) {
}
或尝试转换为数组,如:
iterator_to_array($results);
mongo获取数据并在迭代时间上行进是:
FetchTime: 0.003173828125 ms
IteratorTime: 4065.1459960938 ms
如您所见,通过mongo获取数据的速度太快,但迭代(在使用iterator_to_array或使用foreach的情况下)都很慢。
这是一个将消息发送到另一台服务器的队列。目标服务器每个请求接受的文档少于70个。所以我不得不拿70个文件。无论如何。我想从1,300,000个文档中获取70个文档,这里有问题。 查询尝试获取前70个具有查询条件的文档,发送它们,最后从集合中删除它们。
任何人都可以帮忙吗?为什么需要很长时间?或者是否有加速php或mongo的配置?
另一方面,当数据总数达到100,000(而不是1,300,000)时,旅行速度很快。随着文件总数的增加,旅行时间会增加。
答案 0 :(得分:0)
那是因为排序。
问题: 从mongo获取数据的速度很快,但使用foreach在迭代器中移动速度很慢。
解决方案: 有一种我们用过的。按优先级DESC和create_time ASC排序。这些文件分别是索引ASC。索引优先级DESC和create_time ASC一起解决了问题。
db.queue_1.createIndex( { "priority" : -1, "create_time" : 1 } )
索引上的文件顺序很重要。意味着你应该首先使用优先权。然后使用create_time。 因为当您尝试对查询进行排序时,您可以按如下方式对它们进行排序:
.sort({priority : -1, create_time : 1});