Несколько запросов MYSQL против нескольких циклов php foreach - PullRequest
6 голосов
/ 15 января 2010

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

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');

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

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

Ответы [ 4 ]

9 голосов
/ 15 января 2010

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

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

2 голосов
/ 15 января 2010

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

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

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

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

1 голос
/ 15 января 2010

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

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

0 голосов
/ 15 января 2010

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

Даже если по одному, то вы, вероятно, захотите начать разбивать на страницыс запросами LIMIT / OFFSET довольно быстро, если у вас больше 100 или столько, сколько вы можете разумно отображать на одной странице за раз.

...