【问题标题】:PHP / MySQL Performance SuggestionPHP / MySQL 性能建议
【发布时间】:2013-06-15 22:30:44
【问题描述】:

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

我的问题:

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

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

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

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

很想听听一些建议。

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:

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

    【讨论】:

    • 有趣。从来没有想过使用触发器。我现在要阅读它们。谢谢。
    【解决方案2】:

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

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

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

    • 要么在那个东西上放一个索引,然后计数就会很快
    • 使用触发器/应用程序逻辑自动更新另一个表中的字段

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多