Ефективность подсчета формул в SQL-е.

Уважаемые знатоки HighLoad-a
Вопрос у меня следующий
Пишу плагин который будет заниматься пользовательскими рейтингами. с оху офигенными формулами и алгоритмами.
Но суть не в этом. В плагине есть простой метод подсчета посещений\кол-ва коментариев\голосов
И я незнаю как его лучше реализовать через SQL или через отдельные формулы. Пример:
Подсчет количества посещений:
Вариант1:
$count = oTopic->getViewCount();
$count += 1;
$oTopic->setViewCount($count);
$this->Topic_UpdateTopic($oTopic);

Вариант №2:
$this->Topic_UpdateTopicCount($oTopic)

в маппере:
$sql = "UPDATE topic_rating SET count = count+1 where topic_id = ?d"
$this->oDb->query($sql,oTopic->getId())


Так вот, какой код будет лучше с точки зрения ефективонсти?

13 комментариев

avatar
1. если вы специально получаете топик для варианта 1 для того чтобы обновить, то тогда вариант 2 быстрее — всего один запрос.

если же топик существует уже и вы просто обновляете его, то никакой разницы нет — и там и там всего один запрос.
avatar
1. если вы специально получаете топик для варианта 1 для того чтобы обновить, то тогда вариант 2 быстрее — всего один запрос.
Объект топика я получаю из параметра хука.
т.е. полюбому ВАриант 2?
avatar
Объект топика я получаю из параметра хука.
тогда разницы нет и первый вариант предпочтительней — в стиле ЛС.

вариант был бы верным если бы вы пересохраняли топики, т.е. сначала получали (запрос №1), потом обновляли (запрос №2).
avatar
*
вариант был бы верным
вариант 2 был бы верным
avatar
тогда разницы нет и первый вариант предпочтительней — в стиле ЛС.
Наверное всетаки 2-й вариант. Потому что если я получаю топик через хук topic_show то он какбы не будет обновляться по Topic_UpdateTopic() потому что он только показывается.
avatar
я не понял ответа, но я уже высказал свое мнение.
avatar
Если вы действительно думаете о HighLoad все варианты не верны, нельзя хранить в топике количество просмотров, иначе забудьте про кэш.
  • gran
  • +1
avatar
Я знаю, их я храню в отдельной таблице
avatar
Надо тогда конкретный пример, а не сферических коней)
Если брать пример с топиком то второй будет быстрее, потому что апдейт топика тянет за собой еще дополнительные проверки, выборку топика еще раз, пусть и из кэша.
avatar
Но самый быстрый был бы Redis =)
INCR topic_vcount_ID
  • gran
  • +1
avatar
redis хорош, постараемся выложить плагин, который позволяет удобно работать с отложенными задачами в resque
avatar
Второй вариант представляет собой атомарную операцию, поэтому предпочтительнее первого. В первом варианте могут возникнуть проблемы с конкурирующими запросами.
  • ort
  • 0
avatar
именно поэтому я и выбрал его
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.