【问题标题】:Counting items or incrementing a number?计数项目或增加一个数字?
【发布时间】:2011-10-17 02:38:10
【问题描述】:

对于比我更有经验的人来说,简单地计算表格中的项目数(例如计算类别中的主题数)或保留一个包含该值的变量并仅递增并调用它(类别表中的一个额外字段)?

两者之间是否有显着差异,或者只是非常轻微,即使是轻微的,一种方法仍然比另一种更好吗?它不适用于任何一个特定的项目,所以请笼统地回答(如果有道理的话),而不是基于用户数量之类的东西。

谢谢。

【问题讨论】:

  • 也许你应该澄清你的意图和想法。是不是像“为什么我们总是在 SQL 中使用 COUNT(*)”一样简单?例如

标签: php mysql sql aggregate-functions


【解决方案1】:

要获取项目数(表中的行),您可以使用标准 SQL 并按需执行

SELECT COUNT(*) FROM MyTable

请注意,如果我遗漏了什么,表中的每个项目(行)都有一些唯一标识符,无论是部件号、一些代码还是自动增量。因此,添加新行可能会触发列的“自动增量”。

这与“计算行数”无关。由于 DELETE 或 ROLLBACK,数字可能不连续。

尝试单独维护行数将导致流泪和/或灾难。尝试使用 COUNT(*)+1 或 MAX(id)+1 来生成新的行标识符更糟糕

【讨论】:

  • 既然还是要通过数据库查询来获取值,不如一次性获取值。再说一次,计算行数可能是最简单的查询之一,而且它一定会很快(比得到一个直接的值)。
  • @Christian Sciberras:不使用 COUNT 的权衡是单独维护计数的并发问题......
  • 我尽量避免使用通配符 *,尤其是当函数也在评估它时。如果数据集是 GIANT,则提取所有数据的速度会明显变慢,而不是数据设计中常见的唯一(也是最重要的)标识符。
  • @Blake: SELECT COUNT(*) 优化。不是SELECT *。请参阅这些stackoverflow.com/questions/1747990/…stackoverflow.com/questions/3003457/… 和(最完整)dba.stackexchange.com/questions/2511/…
  • @gbn 回复您对我的评论。权衡不仅如此,它还会影响性能。使用INSERT <row> 进行一次写入,而使用INSERT <row>; UPDATE <row> 进行两次写入。关键是手动增量的实现最终可能会比仅执行 COUNT() 查询稍慢。
【解决方案2】:

我认为您的问题有些混乱。我的解释是您是否要创建 select count(*) 或跟踪实际计数的列。

如果您没有理由这样做,我不会添加这样的列。这是过早的优化,会使您的软件设计复杂化。

此外,您希望避免将相同的信息存储在不同的位置。计数是一项微不足道的任务,因此您实际上是在复制信息,这是个坏主意。

【讨论】:

    【解决方案3】:

    我只会数数。如果您发现性能问题,您可以考虑其他选项,但是一旦您保持一个独立的值,您就必须做一些工作以确保它始终正确。可以这么说,使用COUNT(),您总是会“直接从马嘴里”得到实际数字。

    基本上,在必要之前不要开始优化。如果使用COUNT() 一切正常且快速,请执行此操作。否则,将计数存储在某处,而不是通过加/减来更新存储的值,而是在需要时运行 COUNT() 以获取新的项目数

    【讨论】:

      【解决方案4】:

      在我的论坛中,我统计了这样一个论坛中的子线程:

      SELECT COUNT(forumid) AS count FROM forumtable
      

      只要您使用相同的标识符来指定哪个论坛和/或子版块,并且该列具有索引键,它就非常快。因此,没有理由添加比您需要的更多的列。

      【讨论】:

      • 我认为他想计算表格中的元素..auto_increment 不适合。
      • 是的,我将计算表中的项目数与将数字存储为字段进行比较,例如将该论坛类别表中的论坛中创建的主题数计算为字段而不是每次查看统计数据时都要重新计算。
      • 哦,在我看来,他似乎是在尝试计算表中的行数,以便提供一个 id 来再添加一个。那我调整一下答案吧。
      猜你喜欢
      • 1970-01-01
      • 2015-10-10
      • 1970-01-01
      • 2021-11-20
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多