Optimalizace používání SQL dotazů v PHP
Provádění SQL dotazů k databázi je velmi pomalá operace. Proto je třeba se snažit minimalizovat počet dotazů k databázi.
Nejčastější chybou je provádění velkého množství SQL dotazů ve smyčce, zatímco existují alternativní dotazy, které umožňují provést požadovanou akci jedním příkazem.
Podívejme se na příklad.
Předpokládejme, že máme pole s id záznamů
v databázi a potřebujeme smazat záznamy
s takovými id.
Bez dlouhého přemýšlení lze napsat takovou "skvělou" konstrukci:
<?php
$ids = [1, 2, 3, 4, 5]; // pole pro smazání
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Problém tohoto kódu je v tom, že ve smyčce se provádí
velké množství dotazů. Představte si, že
v poli bude 100 prvků - provede se
100 dotazů k databázi!
Záludnost popsaného úkolu spočívá v tom, že během vývoje webu je databáze malá a dotazy se provádějí velmi rychle. Avšak během provozu webu na hostingu databáze poroste, dotazy se budou provádět stále pomaleji a může dojít k tomu, že kvůli provedení stovky dotazů ve smyčce se bude web načítat více než minutu!
S vynaložením velmi malého úsilí lze dosáhnout toho, že se provede pouze jeden dotaz, takto:
<?php
$ids = [1, 2, 3, 4, 5];
$str = implode(',', $ids); // získáme řetězec '1,2,3,4,5'
mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Optimalizujte níže uvedený kód:
<?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);
?>