Я заранее знаю, что мне понадобится куча строк из определенной таблицы, но я не знаю, в каком порядке мне понадобится каждый.
В целом, с точки зрения производительности и наилучшей практики, лучше ли:
Сделайте один общий запрос, который возвращает все строки, которые, как я знаю, мне в конечном итоге понадобится, а затем используйте PHP (или что-то еще), чтобы выбрать каждый из них, поскольку он мне нужен; или,
Делайте много запросов, используя WHERE, чтобы выбирать только каждую строку, сколько мне нужно.
Количество строк, которые мне понадобятся, примерно 300-600, и страница не должна загружаться более чем несколько раз в минуту (хотя я бы хотел выбрать решение, которое будет справляться с более тяжелыми нагрузками, чем это) ,
Изменить для получения дополнительной информации: Я использую PostgreSQL. С течением времени таблица станет довольно большой, возможно, со многими тысячами строк. Я могу определить, прежде чем делать какие-либо запросы точно, какие строки мне понадобятся (как я сказал, n ~ 500), но я не знаю, какой порядок мне понадобится. Так что это либо 1 запрос, либо n PHP ищет конкретные значения в массиве или n запросов с различным предложением WHERE каждый раз. Я склоняюсь к первому.
Почти всегда быстрее делать один запрос вместо n запросов, когда это возможно. Если ваш результирующий набор находится в ассоциативном массиве, отдельные строки не будут индексироваться в массиве. Но, если вы перебираете массив результатов и набираете элементы массива с помощью идентификатора строки, они станут быстрее для случайного доступа в PHP (вместо того, чтобы каждый раз проходить через весь массив, чтобы найти нужную строку). Разумеется, для копирования элементов массива потребуется немного больше памяти.
В любом случае, это намного быстрее, чем возврат к базе данных каждый раз, особенно если вы будете ударять его сотни раз.
Лучший вариант – вытащить ваши записи из РСУБД в том порядке, в котором они вам понадобятся с ORDER BY
. Тогда случайный доступ не является проблемой.
В любом случае, 600 строк не так сильно звучат. Убедитесь, что у вас есть индексы в соответствующих столбцах, поэтому ваш запрос оптимизирован, и все будет в порядке.
EDIT При извлечении строк создайте индекс массива. Теперь вам не нужно искать массив, так как вы можете просто получить доступ к нему по индексу.
$rowset = array(); while ($row = pg_fetch_assoc($result)) { // Append rows to $rowset indexed by the 'id' column // Use whatever column you'll need to be searching with PHP $rowset[$row['id']] = $row; }
Создайте динамический SQL-запрос с соответствующим фильтром в предложении WHERE. Вы не должны тянуть наихудший случай 600 строк по проводам и в память – это не очень хороший дизайн.