Оптимизация использования SQL запросов в PHP

Выполнение SQL запросов к базе данных является очень медленной операцией. Поэтому нужно стараться минимизировать количество запросов к базе.

Самой распространенной ошибкой является выполнение множества SQL запросов в цикле, при том, что существуют альтернативные запросы, позволяющие выполнить желаемое одной командой.

Посмотрим на примере.

Пусть у нас дан массив с id записей в базе данных и нам необходимо удалить записи с такими id.

Не долго думая, можно написать вот такую "замечательную" конструкцию:

php<?php
  $ids = [1, 2, 3, 4, 5]; // массив для удаления
  
  foreach ($ids as $id) {
    mysqli_query($link, "DELETE FROM users WHERE id=$id");
  }
?>

Проблема этого кода в том, что в цикле выполняется множество запросов. Представьте себе, что в массиве будет 100 элементов - выполнится 100 запросов к базе!

Особая ловушка описанной задачи в том, что при разработке сайта база данных маленькая и запросы выполняются очень быстро. Однако, по мере работы сайта на хостинге база будет расти, запросы будут выполнятся все медленнее, и может дойти до такого, что из-за выполнении сотни запросов в цикле сайт будет грузится более минуты!

Приложив совсем немного усилий, можно сделать так, что будет выполнятся всего один запрос, вот так:

php<?php
  $ids = [1, 2, 3, 4, 5];
  
  $str = implode(',', $ids); // получим строку '1,2,3,4,5'
  mysqli_query($link, "DELETE FROM users WHERE id IN ($str)");
?>
Задание 1

Оптимизируйте приведенный ниже код:

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