我有三个表,一个用于文章,一个用于评论,一个用于评论,一个用于访问,在此示例模式中
**news**
news_id
**comments**
comment_id
news_id
**likes**
like_id
news_id
**hits**
hit_id
news_id
我想要做的是在每个文章的box / div中收听可排序索引中的所有文章,其中包含点击次数,评论和喜欢的文章数量,我知道如何做到这一切,所以这不是怎么回事我正在寻找,这是最好的方式,我正在考虑这两种解决方案。
以正常方式执行,复杂的SQL查询然后缓存查询,比方说一两个小时。
编写一个每两到三个小时执行一次的脚本来计算数据并将其存储在“news_hits,news_likes,news_comments”数字字段的同一个新闻表中。
当然第三种方法是每次加载页面时都进行查询而不进行任何缓存。
我觉得这是我追求的第一种方法,但我想要一个专业或经验丰富的意见,我不期待大量的访客,每天最多500-1000,但我还是想做好准备为了高流量。
谢谢,
拉米
答案 0 :(得分:4)
最好在这种情况下承认冗余,以提高速度。在新闻表中,添加以下字段:
comments_count int not null default 0,
likes_count int not null default 0,
hits_count int not null default 0
当添加/删除注释/ like / hit时,如果数据库支持触发器,则触发引用计数器的递增/递减,如果不支持 - 在每次插入/删除时手动执行(存储过程可能?)。
这类数据通常是读取而不是写入,因此为了优化读取速度,降低写入速度和存储空间并不是什么大问题。
如果由于某种原因导致错误,可以运行一个更新这些计数器的查询。
答案 1 :(得分:2)
将复杂的SQL分解为几个较小的查询(不太复杂)并缓存单个结果,因此在任何时候你想要准备预热缓存,它不会占用太多的数据库资源
答案 2 :(得分:0)
使用这样一个简单的模型,查询和访问量较少的我会直接查询。它将通过适当的索引执行得很好(毫秒)。
如果我正确理解了场景,那么查询应该根据新闻文章的受欢迎程度对新闻文章进行排序,这在某种程度上由喜欢/点击/评论的nr确定。
如果您已经着手解决性能问题,可能实际上没有遇到,最简单的“解决方案”是使用每10秒到期的查询缓存。使用当前负载,每个访问者基本上总是从数据库呈现视图,因为缓存在页面访问之间到期。如果有一天你突然被200,000名访客淹没,你只会每10秒执行一次查询。