SQL lekérdezések optimalizálása PHP-ban
Az SQL lekérdezések végrehajtása az adatbázisban nagyon lassú művelet. Ezért igyekezni kell minimalizálni az adatbázis lekérdezések számát.
A leggyakoribb hiba számos SQL lekérdezés végrehajtása egy ciklusban, miközben léteznek alternatív lekérdezések, amelyek lehetővé teszik a kívánt művelet elvégzését egyetlen paranccsal.
Nézzük ezt egy példán keresztül.
Tegyük fel, hogy kapunk egy tömböt a rekordok id
adataival az adatbázisban, és törölnünk kell azokat a rekordokat,
amelyek ezekkel a id értékekkel rendelkeznek.
Gondolkodás nélkül megírhatnánk egy ilyen "csodás" konstrukciót:
<?php
$ids = [1, 2, 3, 4, 5]; // törlendő tömb
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Ennek a kódnak a problémája az, hogy a ciklusban számtalan
lekérdezés hajtódik végre. Képzeld el, hogy
a tömbben 100 elem van - 100 lekérdezés
fog lefutni az adatbázison!
Az említett feladat különös buktatója, hogy amikor a weboldalt fejlesztjük, az adatbázis kicsi és a lekérdezések nagyon gyorsan lefutnak. Azonban, ahogy a weboldal a hosztoláson működik, az adatbázis növekedni fog, a lekérdezések egyre lassabban fognak futni, és eljuthat oda a helyzet, hogy a száz lekérdezés ciklusban történő végrehajtása miatt a weboldal több mint egy percig tölt!
Nagyon kevés erőfeszítéssel elérhetjük, hogy csak egyetlen lekérdezés hajtódjon végre, így:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // '1,2,3,4,5' stringet kapunk
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimalizálja az alábbi kódot:
<?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);
?>