我正在计划表格的表格结构和编程,这个表格将有大约10亿行。
我经常想做SELECT COUNT(*) ON mytable WHERE somecol="5"
。 somecol
会有一个索引,并且是INT
。
选项1是我只有一个巨大的表并使用上面的SELECT COUNT(*)
。
选项2是我或者可以有一个名为mytableofcounts
的附加表,其中我只有两列:somecol
和num
,其中我记录了总计数为somecol
。该表只有大约几十万行,somecol
将是唯一的。然后我可以SELECT num FROM mytableofcounts WHERE somecol="5"
代替。
我更喜欢选项1,因为它在存储和编程方面既简单又高效,但我担心的是它可能很慢。通过使用选项2的额外表格可以节省处理速度,还是与选项1一样快?
答案 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操作。
对于前端应用程序,第二个选项更好,在那里你有很多需要计数结果的视图,因此在十亿行表上工作并不是很方便。使用此解决方案,您可以使用自动触发器来管理计数器更新,前提是计数器每天不会更新数千次。