您应该将表计数存储在另一个表中吗?

时间:2018-02-27 20:59:55

标签: mysql sql

我继承了一个项目,其中一个突出的问题是,某些表记录计数需要作为统计信息显示给用户。

我刚刚完成了select Count(*) from Table1并且称它为一天,但是只要在该表中插入某些内容,它们似乎就会拥有它,另一个表会使用最新的计数进行更新。

所以说Table1 had 100 rows,这个storageTable会有一个名为Table1的列,其数量为100.如果在Table1中插入了新行,那么{{1}将更新为101。

我唯一能想到为什么会这样做是因为速度。如果我执行storageTable,则返回计数需要4秒钟,因为表中有超过400万行。

由于他们必须显示许多这些统计数据,所以时间可能会增加。

我总是知道计算不应该存储,而是在运行中计算,所以我不确定这是不好的做法,或者因为它是计数,所以没关系。

我认为很难确保它是同步的(目前它至少与100不同步)。

2 个答案:

答案 0 :(得分:0)

这既不好也不坏。这只是麻烦。

显然,使用汇总表非常方便快捷地获取汇总数据。这很方便。

但是,要使摘要数据保持最新,需要管理所有表格上的触发器 - insertdelete。这很麻烦,需要在每个表中使用适当的逻辑。这对这些操作的性能也有(小)影响。在批量加载数据和使用truncate table时,还需要注意。

显然,您使用的系统的设计者认为获得计数非常重要,因此值得花费。

答案 1 :(得分:0)

当我在一个大型gps项目上工作时,我遇到了同样的问题。 gps设备用于每隔5秒发送一次坐标,我需要计算坐标总数,累计里程数等。我用2种方法做到了

  1. 建立一个基于redis的独立数据库,并动态计算所有这些计数和里程数并将其保存在redis中

  2. 使用应用程序运行队列以进行预定作业,以将数据从redis保存到mysql。

  3. 这取决于您的要求,如果您没有太多的插入查询,您可以简单地在mysql上创建单独的表,否则您可以使用像redis这样的技术。