⊗ppSpOtSQ 92 of 95 menu

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); ?>
daeskkmshi