SQL užklausų naudojimo optimizavimas PHP
SQL užklausų vykdymas duomenų bazėje yra labai lėtas veiksmas. Todėl reikia stengtis sumažinti užklausų skaičių į duomenų bazę.
Dažniausia klaida yra daugelio SQL užklausų vykdymas cikle, nors egzistuoja alternatyvios užklausos, leidžiančios pageidautina veiksmą atlikti viena komanda.
Pažiūrėkime pavyzdžiu.
Tarkime, kad mums duotas masyvas su id įrašų
duomenų bazėje ir mums reikia ištrinti įrašus
su tokiais id.
Negalvojant ilgai, galima parašyti tokią "nuostabią" konstrukciją:
<?php
$ids = [1, 2, 3, 4, 5]; // masyvas trinimui
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Šio kodo problema ta, kad cikle vykdoma
daug užklausų. Įsivaizduokite, kad
masyve bus 100 elementų - vyks
100 užklausos į duomenų bazę!
Ypatinga aprašytos užduotės spastai ta, kad kuriant svetainę duomenų bazė yra maža ir užklausos vykdomos labai greitai. Tačiau, veikiant svetainei talpinimo srityje, duomenų bazė augs, užklausos vyks vis lėčiau, ir gali ateiti toks laikas, kad dėl šimto užklausų vykdymo cikle svetainė krausis ilgiau nei minutę!
Panaudojus nedaug pastangų, galima padaryti taip, kad vyktų tik viena užklausa, štai taip:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // gausime eilutę '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimizuokite žemiau pateiktą kodą:
<?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);
?>