使用MongoDB和PHP的慢速查询
我有两个收藏。第一个$bluescan有345个文档,缺少一些['company']值。第二个$maclistResults有20285个文档 我正在对$maclistResults运行$bluescan以填充缺少的['company']值 我使用以下PHP代码为$maclistResults创建了三个索引:使用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
$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