使用MongoDB和PHP的慢速查询

使用MongoDB和PHP的慢速查询,php,performance,mongodb,mlab,Php,Performance,Mongodb,Mlab,我有两个收藏。第一个$bluescan有345个文档,缺少一些['company']值。第二个$maclistResults有20285个文档 我正在对$maclistResults运行$bluescan以填充缺少的['company']值 我使用以下PHP代码为$maclistResults创建了三个索引: $db->$jsonCollectionName->ensureIndex(array('mac' => 1)); $db->$jsonCollectionName

我有两个收藏。第一个$bluescan有345个文档,缺少一些['company']值。第二个$maclistResults有20285个文档

我正在对$maclistResults运行$bluescan以填充缺少的['company']值

我使用以下PHP代码为$maclistResults创建了三个索引:

$db->$jsonCollectionName->ensureIndex(array('mac' => 1));
$db->$jsonCollectionName->ensureIndex(array('company' => 1));
$db->$jsonCollectionName->ensureIndex(array('mac'=>1, 'company'=>1));
我正在为DB使用一个免费帐户,并在本地运行我的PHP应用程序

下面的代码演示了这个过程。它可以工作,做我需要的事情,但执行任务几乎需要64秒

我能做些什么来提高执行时间吗

代码:


附加信息:OSX Yosemite上的PHP版本5.6.2 MAMP PRO

正如SolarBear所述,只要在$bluescan中有元素,就可以执行find

您应该首先从服务器获取列表,然后迭代该结果集,基本上与当前代码的顺序正好相反。

除非我弄错了,否则在foreach循环中执行的每个查找操作都会导致对服务器的调用,这意味着对服务器的调用为345次,加上您以前对$bluescan执行的任何操作。只是网络开销可能会降低程序的性能。。。只需查看这些find调用的各个执行时间。
else
{
  $maclist = 'maclist';
  $time_start = microtime(true);
  foreach ($bluescan as $key => $value)
  {
    $maclistResults = $db->$maclist->find(array('mac'=>substr($value['mac'], 0, 8)), array('mac'=>1, 'company'=>1));
    foreach ($maclistResults as $value2) 
    {
      if (empty($value['company']))
      {
        $bluescan[$key]['company'] = $value2['company'];
      }
    }
  }
}
$time_end = microtime(true);
$time = $time_end - $time_start;
echo "<pre>";
echo "maclistResults execution time: ".$time." seconds";
echo "</pre>";
maclistResults execution time: 63.7298750877 seconds