寻找存储/缓存计数的推荐方法

时间:2012-01-24 18:07:24

标签: php mysql caching architecture

我正在使用php / mysql构建一个网站,其中将有帖子和评论。

帖子需要显示他们的评论数量。我在帖子表中有count_comments列,并在每次创建或删除评论时更新它。

最近有人告诉我,以这种方式进行反恶意化是一个坏主意,我应该使用缓存。

6 个答案:

答案 0 :(得分:2)

我的意思是:你做的是正确的事。原因如下:

将字段count_comments视为 数据模型的一部分 - 这很容易证明,您可以删除此字段的所有内容,重新创建它很简单

相反,将其视为缓存,其存储空间与帖子位于同一位置 - 非常智能,因为您必须随时免费获取查询帖子

答案 1 :(得分:1)

我认为这不是一个坏方法。

我确实认识到的一点是,通过采用更严格的方法扩展代码库非常容易引入副作用。好的部分是在某些时候必须计算或跟踪数据库中的行数,实际上没有办法摆脱这种情况。

我不会反对这一点。获得评论计数还有其他解决方案。查看Which is fastest? SELECT SQL_CALC_FOUND_ROWS FROM `table`, or SELECT COUNT(*)

选择时解决方案较慢,但需要较少的代码来跟踪评论计数。


我会说你的方法避免了LIMIT DE优化,这是一个加分。

答案 2 :(得分:1)

这是一项几乎从不需要的优化,原因有两个:

1)正确的索引将使得简单计数非常快。确保您的comments.post_id列有索引。

2)当你需要缓存这个值时,你需要缓存更多。如果你的网站有很多帖子,评论,用户和流量,你需要缓存评论总的来说,你几乎肯定需要为你的大部分数据/输出采用缓存策略(将构建的页面保存为静态,内存缓存等)。毫无疑问,这些策略将包含你的评论总数,使得表格领域的方法没有实际意义。

答案 3 :(得分:0)

我不知道“缓存”是什么意思,我会对我提供的其他答案感兴趣:

从数据库中删除冗余信息非常重要,并且以“Believer方式”(意味着我没有真正测试它,它只是推测),我认为从数据库中使用SUM()函数是一种更好的方法去吧。 假设您的所有评论都有post_id,您只需要:

SELECT SUM(id) FROM comments WHERE id = {post_id_variation_here}

这样,你可以减少1个常量CRUD,只是为了读取有多少注释并提高性能。

答案 4 :(得分:0)

除非你的应用程序每秒没有数百或数千次点击,否则使用这样的SQL语句没有错:

select posts_field1, ..., (select count(*) from comments where comments_parent = posts_id) as commentNumber from posts

你可以继续缓存页面的html输出。而不是必须完成任何数据库查询。

答案 5 :(得分:0)

Maby您可以将帖子和注释表相互连接,并使用mysql函数计算mysql中的注释行:mysql_num_rows。像这样:

发布表格

postid*
postcontent

评论表

commentid
postid*
comment

然后计算mysql中的注释,如:

$link = mysql_connect("localhost", "mysql_user", "mysql_password"); 
mysql_select_db("database", $link);

$result = mysql_query("SELECT * FROM commenttable WHERE postid = '1'", $link); 
$num_rows = mysql_num_rows($result);