Лишний запрос или лишнее поле в таблице?
Решил перелопатить свою CMS-ку и вот над чем задумался.
Имеем таблицу со статьями. Статья может иметь неограниченное кол-во допустимых комментариев и прикреплененных картинок. Картинки и комментарии, соответственно, хранятся в других таблицах.
При открытии картинки мы считываем саму статью из БД, потом дергаем картинки и комментарии. Но порой бывает, что картинок и комментариев к статье нет, т.е. тем самым мы попросту делаем холостой запрос к БД. Так может стоит завести 2 поля-флага в таблице со статьями: hasImages (да/нет), has Comments(да/нет)? И в зависимости уже от этих флагов решать - слать запросы или нет.
Вот насколько это оправдано и разумно? С одной стороны - лишние поля таблице, но с другой - большая эффективность.
ЗЫ: естественно, вопрос рассматривается относительно сильно нагруженных проектов, так как только в этом случае можно получить какой-то значимый прирост КПД.
ЗЫЫ: естественно, что помимо запроса к статье, существует ещё n различных запросов к серверу (модули, статистика + прочее)
Запрос к бд типа SELECT это достаточно долгая операция если у тебя большая таблица. На это нужно достаточно времени. Тажке БД может быть реализована на другой машине и плюс к этом появляется сетевая задержка.
А поле делай одно и в виде битового поля.
0 - ни картинки, не статьи
1 - есть картинки, нет статей
2 - есть статья, нет картинок
3 - есть и то, и то.
Производительности это конечно добавит, но только для статей без комментов и картинок. А вот для статей которые с картинками и с коментариями производительность будет меньше потому что ты всё равно обращаешься в БД и еще к тому же вычисляешь в скрипте нужно ли это обращение.
В общем если у тебя много "пустых" статей то это имеет смысл.
А если на 50-100 полноценных будет приходится одна "пустая" то скорей всего ниче не выиграешь!
В любой случае ты можешь всё это посчитать на калькуляторе и замерив время выполнения каких то отдельных частей скрипта. Я могу тебе расписать по подробней как это всё делается, если ты не знаешь как это сделать или не хочешь идти "своими путями".
А вообще остановлюсь на варианте со счётчиком - более оптимально и практично. Странно, что сам до этого не додумался))
Поздравляю, вы на ровном месте придумали себе дополнительную проблему :)
И что это интересно даст? RussianSpy пиши пожалуйста поконкретней (я совершенно не понимаю что дадут эти счетчики) а то я начинаю думать, что ваше самомнение а амбиции превыше ваших переживаний за производительность и стабильность.
[QUOTE="hardcase"]Поздравляю, вы на ровном месте придумали себе дополнительную проблему[/QUOTE]
Да там ничего проблематичного) Раз в неделю в самое ненагруженное время выбрать, допустим, последний 150-200 записей (больше, я думаю, смысла и не имеет) и проверять их в течение часа поочередно (ну чтобы не было единовременной нагрузки сильной).
Хотя, если все предусмотреть в скрипте и руки отттуда, откуда надо, то такой проблемы и не будет=)
Я могу предположить что статья с картинками у тебя выводится на странице A.
А комментарии к статье на странице B. Но на странице А пишется число комментов.
Правильно?
Счетчики дадут информацию о наличии либо отсутствии данных. В нашем случае картинок. Если бы вы хоть раз писали высоконагруженные проекты -вы бы это знали.
Подобные счетчики позволяют "размазать" тяжелые вычисления по времени. Когда у вас в таблице 15 миллионов записей, разбитых по нескольким тысячам категорий, то лучше считать один раз при добавлении данных в категорию чем много раз при запросах выборки. Здесь, конечно, не миллионы записей, но все равно даст определенные небольшие плюсы.
Если б у него было это вмененное "самомнение и амбиции" во вмененном же объеме, он бы взял ник типа RussianSpy Великолепный, можете не сомневаться. :D
Я могу предположить что статья с картинками у тебя выводится на странице A.
А комментарии к статье на странице B. Но на странице А пишется число комментов.
Правильно?
Список статей выводится массово (например, список статей в разделе). Плюс к названиям статей выводится статистика, которой необходимо использовать вот эти данные счетчика.
Можете смело делать счетчики. Это весьма распространенная практика на средних, крупных и очень крупных ресурсах. Всегда стараются свести затраты на расчет каждой страницы к минимуму, а подобные счетчики позволяют сэкономить порой до 90% процессорного времени.
Кто не верит - попробуйте на досуге запустить какой-нибудь сложный запрос с агрегирующими функциями на таблицах в 35-50 миллионов записей.