Оптимизация использования SQL запросов в PHP
Выполнение SQL запросов к базе данных является очень медленной операцией. Поэтому нужно стараться минимизировать количество запросов к базе.
Самой распространенной ошибкой является выполнение множества SQL запросов в цикле, при том, что существуют альтернативные запросы, позволяющие выполнить желаемое одной командой.
Посмотрим на примере.
Пусть у нас дан массив с id
записей
в базе данных и нам необходимо удалить записи
с такими id
.
Не долго думая, можно написать вот такую "замечательную" конструкцию:
<?php
$ids = [1, 2, 3, 4, 5]; // массив для удаления
foreach ($ids as $id) {
mysqli_query($link, "DELETE FROM users WHERE id=$id");
}
?>
Проблема этого кода в том, что в цикле выполняется
множество запросов. Представьте себе, что
в массиве будет 100
элементов - выполнится
100
запросов к базе!
Особая ловушка описанной задачи в том, что при разработке сайта база данных маленькая и запросы выполняются очень быстро. Однако, по мере работы сайта на хостинге база будет расти, запросы будут выполнятся все медленнее, и может дойти до такого, что из-за выполнении сотни запросов в цикле сайт будет грузится более минуты!
Приложив совсем немного усилий, можно сделать так, что будет выполнятся всего один запрос, вот так:
<?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)");
?>
Оптимизируйте приведенный ниже код:
<?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);
?>