SQL päringute optimeerimine PHP-s
SQL päringute käivitamine andmebaasi on väga aeglane toiming. Seetõttu tuleks püüda minimeerida andmebaasi päringute arvu.
Kõige levinum viga on mitme SQL päringu käivitamine tsüklis, kuigi on olemas alternatiivsed päringud, mis võimaldavad soovitud toimingut teha ühe käsklusega.
Vaatame näidet.
Oletame, et meil on massiiv andmebaasi
kirjetega id väärtustega ja meil
on vaja kustutada kirjed nende
id väärtustega.
Mõtlemata pikemalt, võib kirjutada järgmise "imelise" konstruktsiooni:
<?php
$ids = [1, 2, 3, 4, 5]; // kustutatav massiiv
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Selle koodi probleem on selles, et
tsüklis käivitatakse palju päringuid.
Kujutage ette, et massiivis on
100 elementi - tehakse
100 andmebaasipäringut!
Kirjeldatud ülesande eripära on selles, et veebisaidi arendamise ajal on andmebaas väike ja päringud käivituvad väga kiiresti. Siiski, kui sait hostingu peal töötab, andmebaas kasvab, päringud muutuvad aina aeglasemaks ja võib jõuda selleni, et sadade päringute käivitamine tsüklis põhjustab veebilehe laadimise ajal üle minuti!
Väikese pingutusega saab teha nii, et käivitatakse vaid üks päring, nagu siin:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // saame stringi '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimeerige allolev kood:
<?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);
?>