Ottimizzazione dell'utilizzo delle query SQL in PHP
L'esecuzione di query SQL verso il database è un'operazione molto lenta. Pertanto, è necessario cercare di minimizzare il numero di query al database.
L'errore più comune è l'esecuzione di numerose query SQL in un ciclo, quando esistono query alternative che permettono di ottenere lo stesso risultato con un unico comando.
Vediamo un esempio.
Supponiamo di avere un array con gli id dei record
nel database e di dover eliminare i record
con tali id.
Senza pensarci troppo, si potrebbe scrivere questa "meravigliosa" costruzione:
<?php
$ids = [1, 2, 3, 4, 5]; // array da eliminare
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Il problema di questo codice è che nel ciclo vengono eseguite
molte query. Immaginate che
l'array contenga 100 elementi - verrebbero eseguite
100 query al database!
La trappola particolare del compito descritto è che durante lo sviluppo del sito il database è piccolo e le query vengono eseguite molto velocemente. Tuttavia, man mano che il sito lavora sull'hosting, il database crescerà, le query diventeranno sempre più lente, e potrebbe arrivare al punto che, a causa dell'esecuzione di centinaia di query in un ciclo, il sito impiegherà più di un minuto per caricarsi!
Con pochissimo sforzo, si può fare in modo che venga eseguita una sola query, in questo modo:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // otterremo la stringa '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Ottimizzate il codice qui sotto:
<?php
$arr = [1, 2, 2, 4, 5];
$res = [];
for ($i = 1; $i < count($arr); $i++) {
$note = mysqli_query($link, "SELECT * FROM users WHERE id=$id");
for ($data = []; $row = mysqli_fetch_assoc($note); $data[] = $row);
$res[] = $data;
}
var_dump($res);
?>