У меня есть две таблицы innodb:
статей
id | title | sum_votes
------------------------------
1 | art 1 | 5
2 | art 2 | 8
3 | art 3 | 35
голосов
id | article_id | vote
------------------------------
1 | 1 | 1
2 | 1 | 2
3 | 1 | 2
4 | 2 | 10
5 | 2 | -2
6 | 3 | 10
7 | 3 | 15
8 | 3 | 12
9 | 3 | -2
Когда новая запись вставляется в таблицу голосов
, я хочу обновить sum_votes
в таблице статей
путем вычисления суммы всех голосов.
Какой способ более эффективен, если само вычисление SUM () является очень сложным ( В таблице голосов
700К записей).
1. Создание триггера
CREATE TRIGGER `views_on_insert`
AFTER INSERT
ON `votes`
FOR EACH ROW
BEGIN
UPDATE `articles` SET
sum_votes = (
SELECT SUM(`vote`)
FROM `votes`
WHERE `id` = NEW.article_id
)
WHERE `id` = NEW.article_id;
END;
2. Использование двух запросов в моем приложении
SELECT SUM(`vote`) FROM `votes` WHERE `article_id` = 1;
UPDATE `articles`
SET sum_votes = <1st_query_result>
WHERE `id` = 1;
1-й способ кажется более чистым, но будет ли таблица заблокирована на все время выполнения запроса SELECT?