Делаю интернет магазин на архитектуре MVC. Есть ссылка в формате:
site.com/категория/подкатегория
Есть контроллер categoryController@actionIndex
:
public function actionIndex($parentCategory, $childrenCategory = false) {
//находим категорию в базе данных
$category = Category::getCategoryById($parentCategory);
if ($category) {
//если категория есть, смотрим, есть ли в ссылке 2 параметр
if ($childrenCategory) {
//если есть, то ищем дочернюю категорию в базе данных
$childCategory = Category::getCategoryById($childrenCategory);
if ($childCategory['parent_id'] == $category['id']) {
//если находим, выводим вьюху для категорий
} else {
//иначе выдаем 404 ошибку.
Scripts::set404();
}
} else {
echo 'Дочерней категории нет, все окей';
}
}
return true;
}
В данном контроллере есть 2 запроса к БД: 1 - ищем по названию родительскую категорию, 2 - ищем дочернюю
Вопрос: что будет более быстро работать и меньше нагружать сервер: 2 отдельных запроса к БД или 1 запрос с оператором WHERE caterogy.name IN (*перечисляем названия категорий*)
, а затем уже преобразуем данные из массива о родительской и дочерней категории?
Определенно, 1 запрос работает быстрее, чем 2, как это заметил @nick_n_a, хоть и не во всех случаях. Если запрос перебирает много данных и данные не помещаются в память, то вероятно 2 запроса будут работать быстрее одного из-за меньшего количества операций с диском.
В вашем случае, действительно правильно использовать 1 запрос, если требуются 2 записи, но это не критично
Ведь если база данных находится рядом с приложением и таблица не большая, вы существенной разницы не заметите, если будете использовать 1 запрос вместо двух, так как вы делаете запрос по индексу (у вас же name - INDEX?), а индекс позволяет быстро позволит достать нужную запись из таблицы. Задержки на соединение и на получение данных у Вас практический отсутствуют. Дополнительная 1 мс не сыграет роли в ответе для пользователя.
Другое дело, если база данных находится не в одном дата-центре или таблица очень большая и название не помещается в индекс, то обязательно надо использовать 1 запрос вместо двух, так как появляются задержки на соединение или перебор данных.
Чаще всего, подобные запросы связанные с получением редко изменяемых данных, но часто запрашиваемых данных по индексу, то их стараются кэшировать, чтобы сократить количество обращений к записи в базе данных.
Применяйте кеширование при выполнении подобных запросов и вы уменьшите лишнюю нагрузку на базу данных.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Приветствую, подскажите пожалуйста как с помощью этого примера
Не могу понять что я делаю не так, символы вроде бы перепроверил: