Как таблицы innodb блокируются при обработке триггера ON INSERT?

У меня есть две таблицы 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?

5
задан OMG Ponies 14 May 2011 в 17:01
поделиться