【问题标题】:How fast is COUNT in MySQL? [closed]MySQL中的COUNT有多快? [关闭]
【发布时间】:2013-03-21 01:50:35
【问题描述】:

我正在为一个大约有十亿行的表规划表结构和编程。

我经常想做SELECT COUNT(*) ON mytable WHERE somecol="5"somecol 将有一个索引,并且是 INT

选项 1 是我只有一张大桌子并使用 SELECT COUNT(*) 如上所述。

选项 2 是我也可以有一个名为 mytableofcounts 的附加表,其中我只有两列:somecolnum,并且我在其中记录了 somecol 的总计数。该表将只有大约几十万行,somecol 将是唯一的。然后我可以SELECT num FROM mytableofcounts WHERE somecol="5" 代替。

我更喜欢选项 1,因为它在存储和编程方面更容易且更高效,但我担心它可能会很慢。我会通过使用选项 2 的额外表来节省处理速度,还是使用选项 1 一样快?

【问题讨论】:

标签: mysql


【解决方案1】:

如果你在somecol上有索引,那么数据库基本上是在实现你的第二种方法。

当它扫描索引时,引擎可以采用两种方法。它可以直接从索引中获取计数,也可以使用索引来获取页面。如果你有这个:

select count(anothercol)
from mytable
where somecol = 5;

然后引擎可以识别somecol = 5所在的行,但它仍然需要读取数据页以确定anothercol是否为NULL。

我很确定count(*) 只会扫描索引而不读取数据页。如果您想确定,请使用:

select count(somecol)
from mytable
where somecol = 5;

【讨论】:

【解决方案2】:

选项 2 可能是索引的想法...有几种类型的索引...我强烈建议您阅读它们。那你就可以自己做决定了。

很久以前我在计算行数并将值放在另一个表中时使用了您的第二个选项。它确实比选项 1 更快......尤其是在数据很大的情况下。但你需要不断更新它。

问候

【讨论】:

    【解决方案3】:

    这在很大程度上取决于应用程序的类型。

    如果您的更新操作多于读取操作(即后端系统),则第一个解决方案更简单,实际上更快,因为您不必在每次更新时执行 COUNT 操作。

    第二个选项更适合前端应用程序,其中您有很多需要计数结果的视图,因此处理十亿行表不是很方便。使用此解决方案,您可以使用自动触发器来管理计数器更新,前提是计数器不会每天更新一千次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 2021-08-09
      • 2012-12-24
      • 1970-01-01
      • 2023-03-18
      相关资源
      最近更新 更多