Optimizarea utilizării interogărilor SQL în PHP
Executarea interogărilor SQL către baza de date este o operație foarte lentă. De aceea, trebuie să încercăm să minimizăm numărul de interogări către bază.
Cea mai frecventă greșeală este executarea unei multitudini de interogări SQL într-o buclă, atunci când există interogări alternative care permit realizarea dorinței cu o singură comandă.
Să privim un exemplu.
Să presupunem că avem un array cu id-uri ale înregistrărilor
în baza de date și trebuie să ștergem înregistrările
cu astfel de id.
Fără să ne gândim mult, am putea scrie următoarea construcție "minunată":
<?php
$ids = [1, 2, 3, 4, 5]; // array pentru ștergere
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Problema acestui cod este că în buclă se execută
multe interogări. Imaginați-vă că
în array vor fi 100 de elemente - se vor executa
100 de interogări către bază!
Capcana deosebită a sarcinii descrise este că în timpul dezvoltării site-ului, baza de date este mică și interogările se execută foarte repede. Cu toate acestea, pe măsură ce site-ul funcționează pe hosting, baza va crește, interogările se vor executa din ce în ce mai lent, și se poate ajunge la astfel de situații, încă din cauza executării unei sute de interogări în buclă, site-ul se va încărca mai mult de un minut!
Aplicând un efort foarte mic, putem face astfel încât să se execute doar o singură interogare, astfel:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // obținem șirul '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimizați codul de mai jos:
<?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);
?>