好吧,在50号公路上又是一个有趣的问题.
我们希望实现一个真正的论坛灯泡系统,其中用户未读的帖子(在用户的帐户创建之后)显示为未读,直到该状态被清除或用户读取它们为止.
我们认为最好和最简单的方法是实现一个未读消息表.
列是:user_id,board_id,thread_id,post_id,timestamp,和hidden
这对于查看每个用户未读(并链接到它们)的板/线程/帖子非常有效且非常快,但是即使只运行一个SQL查询,用户发布到论坛的速度也很慢:
INSERT IGNORE INTO `forums_lightbulb` SELECT `id`,'x','x','x',UNIX_TIMESTAMP(),0 FROM `users`
Run Code Online (Sandbox Code Playgroud)
我确信这是拥有3065个用户帐户的结果.我怎样才能加快这个过程?我宁愿尽可能保持系统的实时性.
重要说明:请将您的答案限制在共享托管环境中,无需额外预算.我们仅限于PHP和MySQL 5.1.53-log
小智 10
PHPBB做的是一种非常快速的方法.它保留了一个表,用于标记每个线程和每个论坛的最后一次是用户打开它的时间.并使用它来确定是否有未读消息.它允许用户*主题+用户*论坛存储使用方案,同时允许使用非常简单和快速的查询进行检查.
您可以从数据库结构中看到它的工作原理.
# Table: 'phpbb_forums_track'
CREATE TABLE phpbb_forums_track (
user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (user_id, forum_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;
# Table: 'phpbb_topics_track'
CREATE TABLE phpbb_topics_track (
user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
topic_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL,
PRIMARY KEY (user_id, topic_id),
KEY topic_id (topic_id),
KEY forum_id (forum_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;
Run Code Online (Sandbox Code Playgroud)