SQL COUNT (столбец) против дополнительного столбца журналирования ... эффективность? - PullRequest
2 голосов
/ 30 августа 2011

Не могу найти много информации об этом.

У меня есть таблица для регистрации комментариев пользователей. У меня есть еще одна таблица для записи лайков / антипатий других пользователей за каждый комментарий. Поэтому при выборе этих данных для отображения на веб-странице возникает сложный запрос, требующий, чтобы объединения и подзапросы подсчитывали все симпатии / антипатии. Мой пример - это вопрос, с которым мне любезно помогли достичь желаемых результатов:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
  (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=1)likes,
  (SELECT COUNT(*) FROM comment_likers WHERE comment_id=comments.comment_id AND liker=0)dislikes,
  comment_likers.liker
FROM comments
INNER JOIN usrs ON ( comments.usr_id = usrs.usr_id )
LEFT JOIN comment_likers  ON ( comments.comment_id = comment_likers.comment_id 
  AND comment_likers.usr_id = $usrID )
WHERE comments.topic_id=$tpcID
ORDER BY comments.created DESC;

Однако, если бы я добавил столбец «Нравится» и «Не нравится» в таблицу «КОММЕНТАРИИ» и создал триггер для автоматического увеличения / уменьшения этих столбцов при добавлении / удалении «Нравится» в таблицу LIKER, оператор SELECT был бы более простым и более удобным. эффективнее, чем сейчас. Я спрашиваю, эффективнее ли иметь этот сложный запрос с COUNTS или иметь дополнительные столбцы и триггеры?

И в целом, эффективнее ли СЧЕТ или иметь дополнительный столбец для подсчета при регулярном запросе?

1 Ответ

0 голосов
/ 30 августа 2011

Ваш запрос очень неэффективен. Вы можете легко исключить эти подзапросы, что значительно повысит производительность:

Ваши два подзапроса можно заменить просто:

sum(liker) likes,
sum(abs(liker - 1)) dislikes,

Выполнение всего запроса так:

SELECT comments.comment_id, comments.descr, comments.created, usrs.usr_name, 
    sum(liker) likes,
    sum(abs(liker - 1)) dislikes,
    comment_likers.liker
FROM comments
INNER JOIN usrs ON comments.usr_id = usrs.usr_id
LEFT JOIN comment_likers  ON comments.comment_id = comment_likers.comment_id 
  AND comment_likers.usr_id = $usrID
WHERE comments.topic_id=$tpcID
ORDER BY comments.created DESC;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...