我有这个网站,让人们发布其他人可以喜欢的东西,在所有主要页面上它显示了一定数量的小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的一些探索将非常感谢,提前感谢
答案 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然后我会创建以下索引
每24小时我会运行脚本来构建顶级喜欢并将其存储在某种缓存中,这样就可以通过可选写入db来访问数据库服务器来检索它(如果缓存失败,则为fail safe)。
另一个选择是使用键值存储(可能是redis),但它们又取决于你的用例以及你将拥有多少用户。
答案 3 :(得分:0)
你可以做@Abhilash Shukla建议你做的事情,另外你可以在post
表中的帖子上缓存喜欢的数量。您可以每X分钟更新一次缓存,例如,像VBulletin和其他一些论坛那样为线程视图。为此,您可以创建一个表来存储帖子的id,您需要重新计算其数量。并在cron上重新计算。
如果你发现适合这项任务,你甚至可以partition喜欢postid范围的表格。