производительность — медленный запрос с использованием MongoDB и переполнения стека

У меня есть две коллекции. Первый, $ bluescan, содержит 345 документов, а некоторые значения [‘company’] отсутствуют. Второй, $ maclistResults, содержит 20285 документов.

Я запускаю $ bluescan против $ maclistResults, чтобы заполнить пропущенные значения [‘company’].

Я создал три индекса для $ maclistResults, используя следующий код PHP:

$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 (MAMP PRO на OSX Yosemite)

1

Решение

Как заявляет SolarBear, вы на самом деле выполняете поиск так же часто, как и элементы в $ bluescan.

Сначала вы должны получить список с сервера и выполнить итерацию по этому результирующему набору, в основном в обратном порядке вашего текущего кода.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]