MySQL中COUNT的速度有多快?

时间:2013-03-30 13:07:16

标签: mysql

我正在计划表格的表格结构和编程,这个表格将有大约10亿行。

我经常想做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一样快?

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

答案 1 :(得分:0)

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

我很久以前使用了你的第二个选项来计算行并将值放在另一个表中。它实际上比选项1更快......特别是如果数据很大的话。但你需要不断更新它。

此致

答案 2 :(得分:0)

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

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

对于前端应用程序,第二个选项更好,在那里你有很多需要计数结果的视图,因此在十亿行表上工作并不是很方便。使用此解决方案,您可以使用自动触发器来管理计数器更新,前提是计数器每天不会更新数千次。