2017-08-29 79 views
-1

我有这样PHP蒙戈司机光标行多久了这么多

$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); 

蒙戈获取数据和迭代时间旅行是:

FetchTime: 0.003173828125 ms 
IteratorTime: 4065.1459960938 ms 

正如你所看到的,通过蒙戈获取数据太快,但迭代(使用iterator_to_array或使用的foreach的两个情况)是缓慢的。

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

任何人都可以帮忙吗?为什么需要很长时间?或者是否有任何配置加速为PHP或mongo?

另一件事,当数据总数为100,000(不是1,300,000)时,旅行很快。旅行时间将随着文件总数的增加而增加。

+0

实际返回的结果有多少?在4秒钟,我会认为它实际上并不是一个小数目。也许你应该考虑到,而不是返回如此大量的结果,你可能实际上需要一些东西来“减少”服务器本身的结果集。所以你需要给一些背景。作为实际返回结果的数量,以及那里的数量很大(如1000年),那么您应该解释为什么您需要返回1000个结果以及您打算如何处理这些结果。 –

+0

我需要130万个文件中的70个文件。其实我的BATCH_NUMBER是70.正如你所看到的,从mongo获取速度很快。在结果之间旅行是问题。 – hgh

+0

那是你的问题。为什么你可能需要循环130万个文件才能取出70个文件呢?这就是“查询”条件。所以如果有一些其他逻辑决定了'70',那么就需要在服务器上进行。你如何确定你实际需要的'70'?通过编辑并解释**处理游标的代码实际上在做什么,在您的问题中包含详细信息**。 –

回答

0

那是因为排序。

问题: 从mongo获取数据的速度很快,但使用foreach在iterator中移动速度很慢。

解决方案: 有一种我们用过的。按优先级DESC和create_time ASC排序。这些文件是索引ASC seperatly。索引优先级DESC和create_time ASC一起解决了问题。

db.queue_1.createIndex({ "priority" : -1, "create_time" : 1 }) 

fileds在索引中的顺序很重要。意味着你应该首先使用优先权。然后使用create_time。 ,因为当您尝试对您的查询进行排序时,请按如下所示对它们进行排序:

.sort({priority : -1, create_time : 1});