有一个统一的内容,如论坛、新闻、文章等。内容由一个主题及其评论组成。用户写主题和评论,需要保持对每个用户的统计。
第一个想法-创建一个包含字段user_id、forum_thread_count、forum_message_count、news_thread_count、news_message_count等的常规表users_stat。当论坛或评论中出现新话题时,
UPDATE users_stat
SET forum_thread_count = forum_thread_count + 1
WHERE user_id = current_user_id.
但问题是,可以添加新的部分,然后我们需要做alter table with statistics,这并不好。
也有这样的想法。创建一个包含字段user_id、content (varchar 50)、users_stat的表计数器。当论坛或评论中出现新话题时,
UPDATE users_stat
SET counter = counter + 1
WHERE user_id = current_user_id
AND content = 'forum_thread'.
对于第一个主题,当poster的表users_stat中没有记录时,对字段user_id和content建立主索引,然后将统计数据保存到
INSERT INTO users_stat (user_id, content, counter)
VALUES (current_user_id, 'forum_thread', 1 )
ON DUPLICATE KEY UPDATE counter = VALUES (counter + 1).
但事实证明,“插入”只起一次作用,然后,每次保存时,mysql都会分析整个表以查找重复项。如果设置为大容量,则会降低性能。
有人能提出更多的想法吗?
发布于 2014-06-03 04:15:14
类似于你的第三种方法,但是用"content“替换为"content_id",这是一个很小的整数字段,引用contents表。并制作(user_id,content_id)的复合主键以获得更好的性能,制作一个自动增量id,以及一个唯一的(user_id,content_id),即
contents(id, name): data example: (1, "Forum Thread")
user_stat(user_id int, content_id int, counter int): data example: (3, 1, 5)
插入和更新:
INSERT INTO user_stat(user_id, content_id, counter) VALUES ($current_user_id, 1, 1 ) ON DUPLICATE KEY UPDATE counter = VALUES (counter + 1)
https://stackoverflow.com/questions/24006863
复制相似问题