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<?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<?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)");
?>
Задание 1

Optimalizujte níže uvedený kód:

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