Добрый день!
Сегодня с утра решил заняться оптимизацией запросов и обнаружил такую штуку — при выводе комментариев делается N запросов к БД(по количеству комментов) на предмет оценки комментария текущим пользователем. То есть если в статье 30 комментариев — то делается 30 запросов, чтобы проверить оценивали вы его или нет, что не есть хорошо.
Данный хак (для версии инстанта 1.9) модифицирует запрос по получению комментариев и позволяет избавиться от ненужных N запросов.
Сразу скажу — не пугайтесь, что "много букав" — меняется всего 4 строки (две добавить и две изменить).
ВАЖНО: перед правкой обязательно сделайте копии файлов components/comments/model.php и components/comments/frontend.php
1. В файле components/comments/model.php находим строку
меняем на
2. Далее в этой же функции меняем запрос с
На
В запрос добавится две строки
и
После этих правок запрос сразу вернет в поле is_voted "1" если посетитель голосовал за коммент и "0" если не голосовал.
3. В файле components/comments/frontend.php меняем строку
на
4. и строку
на
ВАЖНО: перед правкой обязательно сделайте копии файлов components/comments/model.php и components/comments/frontend.php
Сегодня с утра решил заняться оптимизацией запросов и обнаружил такую штуку — при выводе комментариев делается N запросов к БД(по количеству комментов) на предмет оценки комментария текущим пользователем. То есть если в статье 30 комментариев — то делается 30 запросов, чтобы проверить оценивали вы его или нет, что не есть хорошо.
Данный хак (для версии инстанта 1.9) модифицирует запрос по получению комментариев и позволяет избавиться от ненужных N запросов.
Сразу скажу — не пугайтесь, что "много букав" — меняется всего 4 строки (две добавить и две изменить).
ВАЖНО: перед правкой обязательно сделайте копии файлов components/comments/model.php и components/comments/frontend.php
1. В файле components/comments/model.php находим строку
public function getComments($target, $target_id, $cfg){
public function getComments($target, $target_id, $cfg,$user_id=0){
$sql = "SELECT c.*, IFNULL(v.total_rating, 0) as votes, IFNULL(u.nickname, 0) as nickname, IFNULL(u.login, 0) as login, IFNULL(u.is_deleted, 0) as is_deleted, IFNULL(p.imageurl, 0) as imageurl, (NOW() < DATE_ADD(c.pubdate, INTERVAL {$cfg['edit_minutes']} MINUTE)) as is_editable FROM cms_comments c LEFT JOIN cms_ratings_total v ON v.item_id = c.id AND v.target = 'comment' LEFT JOIN cms_users u ON u.id = c.user_id LEFT JOIN cms_user_profiles p ON p.user_id = u.id WHERE c.target='$target' AND c.target_id=$target_id AND c.published=1 ORDER BY c.pubdate ASC";
$sql = "SELECT c.*, IFNULL(v.total_rating, 0) as votes, IFNULL(u.nickname, 0) as nickname, IFNULL(u.login, 0) as login, IFNULL(u.is_deleted, 0) as is_deleted, IFNULL(p.imageurl, 0) as imageurl, (NOW() < DATE_ADD(c.pubdate, INTERVAL {$cfg['edit_minutes']} MINUTE)) as is_editable ,(IF(r.id,1,0)) as is_voted FROM cms_comments c LEFT JOIN cms_ratings_total v ON v.item_id = c.id AND v.target = 'comment' LEFT JOIN cms_users u ON u.id = c.user_id LEFT JOIN cms_user_profiles p ON p.user_id = u.id LEFT JOIN cms_ratings r on ((r.item_id = c.id)and(r.target='comment')and(r.user_id = $user_id)) WHERE c.target='$target' AND c.target_id=$target_id AND c.published=1 ORDER BY c.pubdate ASC";
,r.id as is_voted
3. В файле components/comments/frontend.php меняем строку
$comments_list = $model->getComments($target, $target_id, $cfg);
$comments_list = $model->getComments($target, $target_id, $cfg,$inUser->id);
$comments[$next]['is_voted'] = ($comments[$next]['is_my'] || $inDB->rows_count('cms_ratings', 'item_id='.$comments[$next]['id'].' AND target=\'comment\' AND user_id='.$inUser->id, 1));
$comments[$next]['is_voted'] = ($comments[$next]['is_my'] || $comments[$next]['is_voted']);
Реклама #
Def 12 лет назад #
SJen 12 лет назад #
Экономия N запросов. Это актуально для тех, у кого много комментариев к статьям (я тоже отношусь к этой группе)
Def 12 лет назад #
SJen 12 лет назад #
Def 12 лет назад #
Malstein 12 лет назад #
SJen 12 лет назад #
Soul 12 лет назад #
Soul 12 лет назад #
mrDON 12 лет назад #
NIKITA 12 лет назад #
my_projects\kristy.sytes.net\www\components\comments\frontend.php on line 156
обновил соmments на изначальный, нет результата
NIKITA 12 лет назад #
SJen 12 лет назад #
SJen 12 лет назад #
Там же синтаксическая ошибка высветилась.
Если есть желание установить хак, закиньте свой frontend.php - помогу поставить.
Роман 12 лет назад #
на этом сайте часто вижу много полезных модификаций, и жалко, если их не будут включать в офф релиз
если можно скиньте сайт в личку :)
GarikKR 12 лет назад #
picaboo 12 лет назад #
ph3no 12 лет назад #
Еще бы проблему помогли бы решить с подвисанием сайта, когда включен вывод гостевых комментариев.
SJen 12 лет назад #
пишите в личку, ну и сайт сразу кидайте.
Ну и вы хак этот поставьте, может проблема сама пропадет - нагрузка то реально снижается оооооочень сильно.
DimaGrr 12 лет назад #
Coolmax 12 лет назад #
SJen 12 лет назад #
veronika 12 лет назад #
SJen 12 лет назад #
Причина только в неправильной правке - что-то не туда вставили. Точнее нельзя сказать, не видя файлы.
veronika 12 лет назад #
SJen 12 лет назад #
у меня сайт одинаково ведет себя на денвере и на реальном сервере, у вас разве по-другому?)
Повторюсь, не видя файлы ничего более конкретно сказать нельзя - или очепятка или не туда копирнули что-то, это самая вероятная причина "неработы" на сервере.
veronika 12 лет назад #
SJen 12 лет назад #
по-другому ничего не решим)
Def 12 лет назад #