2

我有表(1),其中包含表(2)的总记录值。我这样做是为了快速向用户显示总值,而不必在每次打开页面时都运行 select count。

我的问题:

我正在讨论是否在新记录进入时更新表 (1) 中的总记录值,或者每 5 分钟运行一次脚本以更新表 (1) 中的总记录值。

问题是我们计划在一天内创建许多记录,这将导致每个记录的额外更新。

但是,如果我们编写一个脚本,它将需要为 table(1) 中的每条记录运行,并且更新查询将有一个子查询来计算 table(2) 中的记录。该脚本需要每隔 5 到 10 分钟运行一次以保持同步。

table(1) 不会快速增长,也许在高峰期它可能会达到 5000 条左右的记录。table(2) 有可能在短时间内获得超过 100 万条记录。

很想听听一些建议。

4

2 回答 2

2

这就是表 2 上的触发器可能有用的地方,它将表 1 作为同一事务的一部分自动更新,而不是使用 PHP 启动的第二个查询。它仍然是一个轻微的开销,但由数据库本身处理,而不是 PHP 代码中的更大开销,并保持表 1 计数 ACIDly 的准确性(假设您使用事务)

于 2013-06-15T22:37:10.927 回答
2

myisam 和 innodb 引擎之间是有区别的。如果您需要计算表中的总行数COUNT(*) FROM table,而不是使用 myisam,无论表的大小是多少,您都会以非常快的速度获得这个数字(myisam 表已经存储了行数,所以它只是读取它)。

Innodb 不存储此类信息。但如果近似的行数足够,SHOW TABLE STATUS可以使用。

如果您需要根据某事进行计数,COUNT(*) FROM table WHERE ...那么有两种不同的选择:

  • 或者在那个东西上放一个索引,计数会很快
  • 使用触发器/应用程序逻辑自动更新另一个表中的字段
于 2013-06-15T22:48:57.327 回答