Почему PHP Mysql multi_query () медленнее, чем запрос цикла ()

Я работаю над HHVM с MySQL. И я действительно смущен, обнаружив, что пакетирование 2000 sql запросов с использованием multi_query () намного медленнее, чем цикл 2000 с одиночным запросом () (см. Код и результат в конце). При дальнейшем профилировании я обнаружил, что API next_result () занимает большую часть времени (~ 70%).

Мои вопросы:
(1) Почему API next_result () такой медленный?
(2) Если я хочу выполнить тысячи SQL-запросов вместе, есть ли способ лучше, чем простой цикл?
Спасибо!

Вот код (php):

$conn = new mysqli("localhost", "root", "pwd", "table");

$loop = 2000;
$q = "select * from ContactInfo;";

// single query in a loop
$results = array();
$sq_start = microtime(true);
for ($i=0; $i < $loop; $i++) {
$ret = $conn->query($q);
$results[] = $ret;
}
for ($i=0; $i < $loop; $i++) {
$xx = $results[$i]->fetch_all();
}
$sq_end = microtime(true);

// construct the multi-query
for ($i=0; $i < $loop; $i++) {
$m_q .= $q;
}

// multi-query in one round-trip
$mq_start = microtime(true);
$conn->multi_query($m_q);
do {
$ret = $conn->store_result();
$xx = $ret->fetch_all();
} while($conn->next_result());
$mq_end = microtime(true);

echo "Single query: " . ($sq_end - $sq_start)*1000 . " ms\n";
echo "Multi query: " . ($mq_end - $mq_start)*1000 . " ms\n";

Результат следующий:

Single query: 526.38602256775 ms
Multi query: 1408.7419509888 ms

Примечание: в этом случае next_result () будет использовать 922мс.

0

Решение

Самый простой ответ здесь — накладные расходы. multi_query() строит объект данных для каждого набора результатов. Затем он должен хранить этот объект снова и снова.

Напротив, вы выполняете один и тот же запрос снова и снова, но пишете только простой массив данных для хранения результатов. Затем PHP может освободить память предыдущего результирующего набора, потому что вы постоянно перезаписываете одну и ту же переменную (если объект данных ничего не указывает на него внутри, это может быть сборка мусора).

Это не очень хороший вариант использования. Здесь нет реальных приложений, потому что нет необходимости повторять один и тот же запрос снова (ваша БД должна кэшировать результаты при первом запуске, а затем сохранять данные в памяти для более быстрого поиска). Для одного набора результатов, разница здесь ничтожна.

0

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

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

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