ВНИМАНИЕ: Запись на курсы по HTML, CSS, JavaScript, PHP, Python, React, Vue, Laravel и другим фреймворкам и CMS,
а также: помощь в поиске работы и заказов, стажировка на реальных проектах→
⊗ppSpOtSQ 92 of 95 menu
Вступайте в телеграмм-канал сайта code.mu: новинки, статьи, интервью, задачи, бесплатные курсы и тренинги. Жми для вступления:)

Оптимизация использования 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); ?>
byenru