Optymalizacja wykorzystania zapytań SQL w PHP

Wykonywanie zapytań SQL do bazy danych jest bardzo powolną operacją. Dlatego należy starać się minimalizować liczbę zapytań do bazy.

Najczęstszym błędem jest wykonywanie wielu zapytań SQL w pętli, podczas gdy istnieją alternatywne zapytania, pozwalające wykonać pożądane działanie jednym poleceniem.

Spójrzmy na przykład.

Załóżmy, że mamy daną tablicę z id rekordów w bazie danych i musimy usunąć rekordy z takimi id.

Bez dłuższego myślenia, można napisać taką "wspaniałą" konstrukcję:

php<?php
  $ids = [1, 2, 3, 4, 5]; // tablica do usunięcia
  
  foreach ($ids as $id) {
    mysqli_query($link, "DELETE FROM users WHERE id=$id");
  }
?>

Problem tego kodu polega na tym, że w pętli wykonywane jest wiele zapytań. Wyobraź sobie, że w tablicy będzie 100 elementów - wykonają się 100 zapytania do bazy!

Szczególna pułapka opisanego zadania polega na tym, że podczas tworzenia strony baza danych jest mała i zapytania wykonują się bardzo szybko. Jednakże, w miarę działania strony na hostingu baza będzie rosnąć, zapytania będą wykonywane coraz wolniej, i może dojść do tego, że z powodu wykonania setek zapytań w pętli strona będzie ładować się ponad minutę!

Wkładając niewiele wysiłku, można sprawić, że wykona się tylko jedno zapytanie, w ten sposób:

php<?php
  $ids = [1, 2, 3, 4, 5];
  
  $str = implode(',', $ids); // otrzymamy ciąg '1,2,3,4,5'
  mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Задание 1

Zoptymalizuj podany poniżej kod:

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