Запрос к БД в цикле или цикл по выборке?

программирование php MySQL базы данных sql

Как корректнее считается поступать, если необходимо, допустим, составить список на основании выборки из БД:
- сначала единым запросом получить все необходимые значения в переменную из БД и составить потом список;
- или же для каждого элемента делать отдельный запрос к БД в цикле?

Прежде, чем отвечать, подумайте, обоснован ли ответ. Т.к., мне кажется, в первом варианте жертвуем памятью, ведь объем выборки может быть большой и загонять всё это в переменную — громоздко.
А во втором варианте, опять же, нагружаем БД лишний раз, но зато каждое значение перезаписывается в одну переменную и сразу выводится.

Дилемма.

Примечание:
Ну вообще если достичь оптимального варианта не получится (или нет какого-то общепринятого варианта или совета, если этот вопрос поднимается часто), то в приоритете человекопонятность кода. Путем практических экспериментов выяснилось, что под угрозу она ставится в случае реализации первого (из вышеприведенных) вариантов.. Так что, скорее всего, придётся пойти вторым путём.

Примечание:
Такой грубый пример приведу для лучшего понимания отвечающим и себе.
Допустим, у нас есть один мешок с красными, зелеными и желтыми яблоками. И есть ~20 банок. Нам надо в каждую банку кинуть по три разных яблока. Таким образом мы можем пойти двумя путями:
- Высыпать все яблоки из мешка на пол и отбирать оттуда нужные, закидывая в банки.
- Долго ковыряться, ища в мешке нужное и доставать только то яблоко, которого еще нет в наполняемой банке.

Примечание:
Что ж, возможно стоило ещё упомянуть, что непосредственно используется свойство реляционности, так сказать. Т.е. получив из таблицы (которая обеспечивает связь много-много) массив необходимых мне объектов, допустим вида relation[user_ID, content_ID] и для вывода списка я должен из соответствующих таблиц получить данные по user_ID и по content_ID (не айдишники ж выводить).
Это однако выглядит несколько громоздко, если из двух таблиц двумя запросами отобрать данные и потом только их уже обрабатывать. Хотя ваши мнения обоснованны и справедливы. Спасибо всем.

Примечание:
Память дырявая про вложенные запросы забыл, омг :D Спасибо, товарищ. На том, где я пишу, будет сложновато реализовать вложенные, если вообще возможно, но я даже и не пытался.
Ответы:
Чтобы ответить на вопрос надо понимать какую цель вы преследуете. Если снижение накладных расходов при взаимодействии веб-сервер - субд, то вариант первый. Если вы хотите контролировать память на веб-сервере, а лишний запрос не скажется на эффективности, то второй.
Все зависит от конкретной задачи. Чаще один запрос понятнее (данные формируются в одном месте, результатом может быть готовая структура данных). С точки зрения производительности — большое число запросов требует большого времени, один сложный запрос также может быть закеширован.
Я придерживаюсь подход 1. Обычно лучше выполнить один (оптимизированный конечно) монстро-запрос, чем 50 мелких. Для сложных случаев имеет смысл использовать такие штуки как временные таблицы и т.д.
Для вашего последнего примера я использовал бы такой подход:


10 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.