【问题标题】:Database Querying -- Better to count number of rows or better to keep an increment counter?数据库查询——更好地计算行数还是更好地保持增量计数器?
【发布时间】:2011-06-16 07:49:40
【问题描述】:

如果你正在实现一个博客应用程序 - 你会喜欢什么 -
在“POSTS”表中有一个计数器来存储 cmets 的数量

SELECT comment_count 
  FROM posts WHERE post_id = $id 

...或从“COMMENTS”表中计算特定帖子的 cmets 数:

SELECT COUNT(*)
  FROM comments 
 WHERE post_id = $id

哪个更优化?

【问题讨论】:

  • @BenV:MySQL 没有物化视图
  • @OMG:没错,但关于读取与写入的讨论仍然适用。
  • @BenV - 我的问题与那个问题有点不同,我不需要预先计算任何东西,计算是由 SQL COUNT 查询完成的。所以我想知道哪个更好用。

标签: mysql database-design querying


【解决方案1】:

我会使用第二种形式,COUNT,直到我确定该特定 SQL 查询中的性能存在问题。您首先建议的是非规范化,当您确定自己需要它时,这很好而且花花公子。

无论怎样,索引都可以让您非常快速地执行第二个查询。

【讨论】:

    【解决方案2】:

    让我们看看因素。

    案例 1:当您显示帖子时,您会显示 cmets。这意味着您可以全部检索它们并在显示它们时对它们进行计数。在那种情况下,不会。

    案例 2:当您显示帖子时,您不会显示 cmets,而是显示“15 cmets”的链接。在那种情况下,有一个等式。

    实现计数:

    保存一条评论的成本 = 1 次插入 + 1 次更新

    一篇文章展示的成本 = 1 次阅读

    平均博客显示次数 = D

    平均评论数 = C

    那么,显示 D 与评论 C 的比例是多少:

    C *(插入+更新)

    由于 D >> C 通常是正确的,因此我建议该额外更新的成本消失。

    这对于博客来说可能不是那么重要,但它是一个重要的公式,可以知道您何时有很多表并需要做出这些决定。

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 2013-10-07
      • 2018-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多