【问题标题】:Slow query using MongoDB and PHP使用 MongoDB 和 PHP 进行慢速查询
【发布时间】:2015-01-20 02:47:50
【问题描述】:

我有两个系列。第一个,$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));

我正在为数据库使用 MongoLab 免费帐户并在本地运行我的 PHP 应用程序。

下面的代码演示了这个过程。它可以工作,可以满足我的需要,但执行任务需要将近 64 秒。

我能做些什么来改善这个执行时间吗?

代码:

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>";

$time 的回显输出:

maclistResults execution time: 63.7298750877 seconds

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

【问题讨论】:

  • 除非我弄错了,否则您在 foreach 循环中执行的每个 find 操作都会导致对服务器的调用,这意味着对服务器的 345 次调用,以及您在 @987654326 上执行的任何操作@ 之前。只是网络开销可能会影响程序的性能...只需查看这些 find 调用的各个执行时间。

标签: php performance mongodb mlab


【解决方案1】:

正如 SolarBear 所说,您实际上执行 find 的频率与 $bluescan 中的元素一样多。

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

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多