Jonny 5: mysqli_multi_query Abfrage mit while Schleife

Beitrag lesen

Hallo Sven,

Für diese Behauptung hätte ich ja gerne mal Belege oder zumindest Indizien.

es macht Sinn, wenn man viele Updates oder Selects in Batches zusammenfasst, da die Kommunikation zwischen MySql Server und PHP reduziert wird.

Hier ein Beispiel.

  
$db = mysqli_init();  
  
@mysqli_real_connect(  
  $db, DB_IP,  
  DB_USER, DB_PASS,  
  DB_NAME, DB_PORT, DB_SOCK,  
  MYSQLI_CLIENT_COMPRESS  
) or die ("  
  Keine Verbindung zur Datenbank:  
  ".mysqli_connect_error()  
);  
  
// 1.) single selects  
// -----------------------  
  
$mc_test = microtime(true);  
  
for($i=0; $i<=10; $i++)  
{  
  $sql = "SELECT * FROM `test` WHERE `id` =  ".$i.";";  
  $result = mysqli_query($db, $sql);  
  if($result) {  
    while($row = mysqli_fetch_assoc($result)) {  
    }  
  }  
}  
  
echo "1.) ".round(microtime(true)-$mc_test,3)."s<br />";  
  
// 2.) batched selects  
// -----------------------  
  
$mc_test = microtime(true);  
  
$sql_multi = "";  
  
for($i=0; $i<=10; $i++) {  
  $sql_multi .= "SELECT * FROM `test` WHERE `id` =  ".$i.";";  
}  
  
if (!empty($sql_multi)) {  
  if (mysqli_multi_query($db, $sql_multi)) {  
    do {  
      if ($result = mysqli_store_result($db)) {  
        while ($row = mysqli_fetch_assoc($result)) {  
        } mysqli_free_result($result);  
      }  
    } while(mysqli_next_result($db));  
  }  
}  
  
echo "2.) ".round(microtime(true)-$mc_test,3)."s<br />";  
  
// 3.) single updates  
// ----------------------  
  
$mc_test = microtime(true);  
  
for($i=0; $i<=10; $i++) {  
  $sql = "UPDATE `test` SET `value` =  1 WHERE `id` =  ".$i.";";  
  mysqli_query($db,$sql);  
}  
  
echo "3.) ".round(microtime(true)-$mc_test,3)."s<br />";  
  
// 4.) batched updates  
// ----------------------  
  
$mc_test = microtime(true);  
  
$sql_multi = "";  
  
for($i=0; $i<=10; $i++) {  
  $sql_multi .= "UPDATE `test` SET `value` =  1 WHERE `id` =  ".$i.";";  
}  
  
mysqli_multi_query($db, $sql_multi);  
if (mysqli_more_results($db)) {  
  while (mysqli_next_result($db));  
}  
  
echo "4.) ".round(microtime(true)-$mc_test,3)."s<br />";  

Der MySql Server steht in Wien, der Webserver in Salzburg:

1.) 0.216s
2.) 0.06s
3.) 0.234s
4.) 0.062s

Auf dem selben Server in Wien:

1.) 0.002s
2.) 0.001s
3.) 0.001s
4.) 0s

Je nach Anzahl der Queries, kann man so ganz gut Zeit herausholen. Gibt es viele Zugriffe/Sec, kann das wichtig sein.

Herzliche Grüße,
Robert