#php #mysql
#php #mysql
Вопрос:
Итак, у меня есть веб-сайт с каталогом товаров, на этой странице есть 4 ползунка продуктов, один для последних продуктов, другой для бестселлеров, третий для специальных предложений.
Лучше ли создавать запрос для каждого типа слайдера, или я должен получить все продукты, а затем заставить php отсортировать их и разделить на три массива distict по одному для каждого слайдера?
В настоящее время я просто делаю
SELECT * FROM products WHERE deleted = 0
Для тестирования.
Комментарии:
1. В общем, чем меньше обходов к базе данных, тем лучше. Есть исключения. Но это должно быть вашей отправной точкой.
Ответ №1:
Почти всегда лучше уточнить запрос так, чтобы он просто возвращал не только записи, которые вам действительно нужны, но и только те столбцы, которые вам действительно нужны. Итак, в вашем случае это будет выглядеть следующим образом
SELECT id, description, col3
FROM products
WHERE deleted = 0
AND -- conditions that make it fit in the proper slider
Причина в том, что это также требует ресурсов (времени и пропускной способности) для передачи результирующего набора в программу обработки и времени обработки для оценки отдельных возвращаемых записей, и, таким образом, «стоимость» запроса будет меняться в зависимости от размера таблицы, а не от размера набора данных, который вам действительно нужен.
Просто пример, но давайте предположим, что вы хотите создать список 10 лучших продавцов, и у вас есть 100 товаров в истории. Вы получите 100 записей и сохраните 10. Ничего особенного. Теперь ваш магазин растет, и у вас в запасе 100000 наименований. Для получения вашей топ-10 вам придется просмотреть все тезисы и выбросить 99990 записей. 99990 записей вы должны будете прочитать на сервере БД и передать вам, а 99990 записей вы должны индивидуально проверить, входит ли это в топ-10 товаров.
Поскольку запросы такого типа будут выполняться часто, также неплохо оптимизировать их путем индексации столбцов поиска, поскольку индексированный поиск на сервере db выполняется намного быстрее.
Я сказал «почти всегда», потому что есть редкие случаи, когда вам трудно выразить в SQL то, что вам действительно нужно, или когда вам нужно использовать довольно экзотические методы, такие как подсказки запроса, чтобы заставить database engine выполнить ваш запрос достаточно эффективным способом. Но эти случаи довольно редки, и когда запрос выполняется не так, как ожидалось, с помощью некоторого анализа вам удастся улучшить его производительность в большинстве случаев — взгляните на буквально тысячи вопросов, касающихся оптимизации запросов, здесь, на SO.
Комментарии:
1. Хотя технически здесь нет ничего неправильного, и он полон полезной и правдивой информации, я чувствую, что в нем скорее отсутствует суть.
2. @Stawberry учитывая ограниченную детализацию вопроса, это лучшее, что я мог сделать — я попытался 1) объяснить проблемы масштабирования, связанные с такого рода «массовыми запросами», 2) тот факт, что часто используемые запросы должны подкрепляться индексами и 3) что если БД работает плохо, вам нужно проанализировать, что происходит, большинство проблем с производительностью можно решить стандартными средствами или улучшенным запросом. Это должно, по крайней мере, заставить OP начать свои исследования. Какой важный момент, по вашему мнению, я пропустил?
3. Эмм, вопрос. Благороднее ли выполнить один запрос или три
4. в @Strawberry OP указано,
should I get all products and then have php sort them out and separate them into three distict arrays one for each slider
что ползунки, по-видимому, являются последними продуктами, бестселлерами и так Далее, Каждый из которых обычно представляет собой небольшие подмножества от общего количества доступных товаров. И, вероятно, почти постоянный по размеру (например, «Top 10» точно определяет размер списка), тогда как инвентарь, скорее всего, будет расти со временем. Проблемы с возвратом — это совершенно другой класс проблем (и в этом сценарии, скорее, неуместный imo).