【发布时间】:2011-01-19 09:49:07
【问题描述】:
我有两个 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
当向votes 表中插入一条新记录时,我想通过计算所有投票的总和来更新articles 表中的sum_votes 字段。
问题
如果 SUM() 计算本身非常繁重(votes 表有 70 万条记录),哪种方式更有效。
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;
第一种方式看起来更简洁,但是会在 SELECT 查询运行的整个过程中锁定表吗?
【问题讨论】:
标签: mysql sql triggers innodb table-locking