Несколько запросов MySQL по сравнению с Несколькими php циклами foreach

Структура базы данных:

id  galleryId                 type     file_name       description
1   `artists_2010-01-15_7c1ec`  `image`  `band602.jpg`   `Red Umbrella Promo`
2   `artists_2010-01-15_7c1ec`  `image`  `nov7.jpg`      `CD Release Party`
3   `artists_2010-01-15_7c1ec`  `video`  `band.flv`      `Presskit`

Я собираюсь вытащить изображения для одного раздела приложения, видео на другом, и т.д. Лучше сделать несколько запросов mysql для каждого раздела как так:

$query = mysql_query("SELECT * FROM galleries WHERE galleryId='$galleryId' && type='image');

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

Спасибо за мысли.

6
задан jay 15 January 2010 в 17:55
поделиться

4 ответа

Это зависит от того, что важнее: читаемость или производительность. Я ожидаю, что один запрос и префилирование PHP-массивов будет быстрее выполнить, поскольку соединения базы данных стоят дорого, но затем простой запрос для каждого раздела гораздо более читаемый.

Если вы не знаете (а не просто надеюсь), вы собираетесь получить огромное количество трафика, я бы пошел на отдельные запросы, а затем беспокоиться о оптимизации, если похоже, что это будет проблема. В этот момент будет прочими вещами, которые вы захотите сделать, например, создание слоя доступа к данным и добавление кэширования.

9
ответ дан 9 December 2019 в 20:43
поделиться

Если ваши данные все приходят с одной таблицы, я бы сделал только один запрос.

Я предполагаю, что вы строите одну страницу с разделом для фотографий, раздел для видео, раздела для музыки и т. Д. Написать результаты возврата запросов, отсортированные по типу носителя - итерации через все картинки, затем все видео, Тогда вся музыка.

1
ответ дан 9 December 2019 в 20:43
поделиться

Возможно, у вас уже есть решение, но для других, которые ищут метод преобразования значения в логическое значение с использованием «стандартных» ложных значений, включая None, [], {} и «» в дополнение к false, no и 0.

def toBoolean( val ):
    """ 
    Get the boolean value of the provided input.

        If the value is a boolean return the value.
        Otherwise check to see if the value is in 
        ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]
        and returns True if value is not in the list
    """

    if val is True or val is False:
        return val

    falseItems = ["false", "f", "no", "n", "none", "0", "[]", "{}", "" ]

    return not str( val ).strip().lower() in falseItems
-121--1782723-

Области предназначены для того, чтобы быть составными, что означает, что вы можете объединить их и это эффективно применяет все условия. В этом случае ActiveRecord слишком наивен, чтобы определить, что явное условие должно свести на нет первое. Он просто создает запрос, объединяющий все предложения с AN. По этой причине у default_scope больше всего утилит с предложениями: order, которые не могут быть составлены (в реализации ActiveRecord 2.3 в любом случае). Здесь более подробно обсуждается .

Также обратите внимание, что в Rails 3 ActiveRecord использует Arel для создания большого количества запросов, что значительно увеличит мощность генерации запросов ActiveRecord, упрощая при этом большое количество внутренних элементов. Вполне вероятно, что с Арелом ваше положение улучшится. В то же время я рекомендую не ставить условия в default_scope, если нет строк, которые вы действительно хотите быть невидимыми для вашего приложения Rails.

-121--2170945-

Если под «разделами» вы подразумеваете отдельные страницы (отдельные HTTP-запросы), которые пользователи могут просматривать, я бы предложил запрос по типу, если это необходимо. Если на странице, где есть только наборы данных изображения, действительно не нужно извлекать набор видеоданных, например. Вы не будете экономить много времени, выбирая все, так как вы будете подключаться к базе данных для каждой страницы в любом случае (я предполагаю.)

Если под «разделами» вы подразумеваете различные части одной страницы, то получить все сразу. Это сэкономит вам время на запрос (только один запрос.)

Но в зависимости от размера вашего набора данных, вы можете столкнуться с проблемами с ограничением памяти PHP, запрашивая все, хотя. Затем можно попытаться увеличить лимит памяти, но если это не удастся, вам, вероятно, придется вернуться к запросу каждого типа.

Использование метода query-per-type перемещает часть вычислительной нагрузки на сервер базы данных, так как вы будете запрашивать и извлекать только то, что вам действительно нужно. И вам не нужно писать код, чтобы фильтровать и сортировать результаты. Фильтрация и сортировка - это то, на что база данных обычно лучше, чем PHP-код. Если это вообще возможно, включите кэш запросов MySQL, что ускорит эти запросы гораздо больше, чем все, что вы можете написать в PHP.

2
ответ дан 9 December 2019 в 20:43
поделиться

Лучше иметь несколько запросов. Каждый раз, когда вы запускаете запрос, все данные выталкиваются и загружаются в память. Если у вас есть 5 разных типов, это означает, что каждая страница этого типа загружается в 5 раз больше данных, сколько нужно сделать.

Даже только с одним за раз, вы, вероятно, собираетесь достаточно быстро, если у вас есть более 100 или однако, многие могут разумно отображаться на одной странице одновременно.

0
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: