喜欢交通繁忙的网站上的帖子

时间:2012-02-20 08:52:53

标签: php mysql sql

我有这个网站,让人们发布其他人可以喜欢的东西,在所有主要页面上它显示了一定数量的小tumbs与喜欢帖子的数量。该网站还有一个“热门”页面,显示过去24小时内最受欢迎的帖子。

我正在考虑制作这样的数据库:

CREATE TABLE likes (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `post` int(11) NOT NULL,
  `user` int(11) NOT NULL,
  `liked` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   PRIMARY KEY (`id`),
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

但是iam害怕它会导致一个性能问题,因为表格真的会非常快,所以查询它会减慢我的数据库速度,是否有一个好的方法来索引这个以帮助提高性能?为第二张桌子制作第二张桌子也是一个好主意只包含过去24小时的热门页面,然后我每天用cron作品取出过期的(24小时以后)吗?

我远非数据库方面的专家,所以对于awnser的一些探索将非常感谢,提前感谢

4 个答案:

答案 0 :(得分:1)

如果您记录哪些人“喜欢”,那么您的方法就会有效。该表将随着使用线性增长,除非该站点变得非常流行,否则这不应该是性能问题。请务必使用InnoDB表,因为MyISAM会在写入时锁定整个表,这是一个写入升沉数据库。

如果仅仅知道喜欢的数量就足够了,那么就这样做:

CREATE TABLE IF NOT EXISTS posts (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `likes` int(11) NOT NULL,
   PRIMARY KEY (`id`),
) ENGINE=InnoDB  DEFAULT CHARSET utf8 AUTO_INCREMENT=1 ;

在每个“赞”上运行此查询:

UPDATE posts SET `likes` = `likes`+1 WHERE id = {$id}";

答案 1 :(得分:1)

好的,你可以做一件事,首先在 likes 表中添加“赞”,然后创建另一个表格命名为“hotlikes”或任何你想要的名称。 ...

在DATE保留 hotlikes 中的字段,并在其中添加日期,通过创建 cron作业

自动删除上一日期的日期

仅显示24小时,如“hotlikes”表....

答案 2 :(得分:1)

让我们说你有相当大的MySql(假设aws ec2大型实例)已经正确调整,索引正确,使用innodb作为存储引擎并使用缓存,你不会有100-200个同时用户服务的问题。您还必须考虑同一数据库机器上正在执行的其他表或数据库。

我认为架构中的帖子和用户如果是,则引用ID然后我会创建以下索引

  1. 主键(显然)
  2. 发布+时间戳
  3. 用户+时间戳(我猜您可能想要用户查询,如果没有,那么这不是必需的)
  4. 每24小时我会运行脚本来构建顶级喜欢并将其存储在某种缓存中,这样就可以通过可选写入db来访问数据库服务器来检索它(如果缓存失败,则为fail safe)。

    另一个选择是使用键值存储(可能是redis),但它们又取决于你的用例以及你将拥有多少用户。

答案 3 :(得分:0)

你可以做@Abhilash Shukla建议你做的事情,另外你可以在post表中的帖子上缓存喜欢的数量。您可以每X分钟更新一次缓存,例如,像VBulletin和其他一些论坛那样为线程视图。为此,您可以创建一个表来存储帖子的id,您需要重新计算其数量。并在cron上重新计算。

如果你发现适合这项任务,你甚至可以partition喜欢postid范围的表格。