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

Optimalizálja az alábbi kódot:

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