Popełniłem taki test:
<?php
$mysqli1 = new mysqli('localhost','root','','test');
$mysqli2 = new mysqli('localhost','root','','test');
$mysqli3 = new mysqli('localhost','root','','test');
$mysqli4 = new mysqli('localhost','root','','test');
$query = "SELECT SQL_NO_CACHE COUNT(*) AS cnt FROM t9";
$result1 = $mysqli1->query($query);
$result2 = $mysqli2->query($query);
$row1 = $result1->fetch_assoc();
$row2 = $result2->fetch_assoc();
$tElapsed = $tEnd - $tStart;
echo '----------------------------'.PHP_EOL
; echo 'Zapytania po kolei'.PHP_EOL
; echo 'Wynik 1. zapytania: '.$row1['cnt'].PHP_EOL
; echo 'Wynik 2. zapytania: '.$row2['cnt'].PHP_EOL
; echo 'Łączny czas: '.$tElapsed.PHP_EOL
; echo '----------------------------'.PHP_EOL
;
$row1 = $row2 = $row3 = $row4 = null;
$mysqli1->query($query,MYSQLI_ASYNC);
$mysqli2->query($query,MYSQLI_ASYNC);
$connArray = array($mysqli1,$mysqli2); $processed = 0;
do {
$links = $errors = $reject = array(); foreach ($connArray as $link) {
$links[] = $errors[] = $reject[] = $link;
}
if (!mysqli_poll($links, $errors, $reject, 1)) {
continue;
}
foreach ($links as $link) {
if ($result = $link->reap_async_query()) {
if($link === $mysqli1) {
$row1 = $result->fetch_assoc();
} else
if($link === $mysqli2) {
$row2 = $result->fetch_assoc();
}
mysqli_free_result($result);
$processed++;
}
}
} while ($processed < count($connArray));
$tElapsed = $tEnd - $tStart;
echo '----------------------------'.PHP_EOL
; echo 'Zapytania asynchroniczne'.PHP_EOL
; echo 'Wynik 1. zapytania: '.$row1['cnt'].PHP_EOL
; echo 'Wynik 2. zapytania: '.$row2['cnt'].PHP_EOL
; echo 'Łączny czas: '.$tElapsed.PHP_EOL
; echo '----------------------------'.PHP_EOL
;
Wyniki
[tt]
----------------------------
Zapytania po kolei
Wynik 1. zapytania: 10032000
Wynik 2. zapytania: 10032000
Łączny czas: 7.5110111236572
----------------------------
----------------------------
Zapytania asynchroniczne
Wynik 1. zapytania: 10032000
Wynik 2. zapytania: 10032000
Łączny czas: 3.6900150775909
----------------------------
[/tt]
Tak więc albo gdzieś popełniłem błąd metodologiczny, albo to całkiem dobra metoda. Chętnie sprawdziłbym więcej równoległych zapytań, ale mam u siebie tylko dwa rdzenie