Optimisation de l'utilisation des requêtes SQL en PHP
L'exécution de requêtes SQL vers une base de données est une opération très lente. C'est pourquoi il faut chercher à minimiser le nombre de requêtes envoyées à la base.
L'erreur la plus courante est l'exécution d'une multitude de requêtes SQL dans une boucle, alors qu'il existe des requêtes alternatives permettant de réaliser l'objectif souhaité en une seule commande.
Regardons un exemple.
Supposons que nous ayons un tableau contenant les id d'enregistrements
dans la base de données et que nous devions supprimer les enregistrements
ayant ces id.
Sans trop réfléchir, on pourrait écrire cette construction "merveilleuse" :
<?php
$ids = [1, 2, 3, 4, 5]; // tableau pour la suppression
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Le problème de ce code est que de nombreuses requêtes sont exécutées
dans la boucle. Imaginez que
le tableau contienne 100 éléments -
100 requêtes seront exécutées vers la base !
Le piège particulier de la tâche décrite est que lors du développement du site, la base de données est petite et les requêtes s'exécutent très rapidement. Cependant, au fur et à mesure que le site fonctionne sur l'hébergement, la base va grandir, les requêtes s'exécuteront de plus en plus lentement, et cela peut aller jusqu'au point où, à cause de l'exécution d'une centaine de requêtes dans une boucle, le site mettra plus d'une minute à charger !
En faisant très peu d'efforts, on peut faire en sorte qu'une seule requête soit exécutée, comme ceci :
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // on obtient la chaîne '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimisez le code ci-dessous :
<?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);
?>