0

我需要一种在不影响用户体验的情况下更新实时机器上的表的方法。

我在 MyISAM 引擎上有几张表,每 15 分钟更新一次。更新脚本只是截断表并从选择语句中插入数据。出现问题,然后用户尝试从正在更新的表中查看信息 - 用户体验滞后,显示不正确的信息。

使用 InnoDB 事务很容易,但是 MyISAM 呢?

4

4 回答 4

2

正如你自己写的。转移到 InnoDB,或者解释是什么阻止了你这样做。

于 2012-06-18T13:45:40.623 回答
2

如果不能迁移到 InnoDB,我唯一能想到的就是在更新的时候加一层缓存。(例如 APC 或 memcached?)

你甚至可以写一些通常会跳过缓存的东西,当你开始一个更新周期时,将缓存中的当前内容设置为“遥远的未来”,从缓存中提供内容,并在更新完成时使它们失效。

额外的好处是你现在有一个工作缓存系统,也许让一切变得更快:)

于 2012-06-18T13:48:58.110 回答
1

如果你必须使用 myISAM,你可以尝试这种事情。您需要使用 5.0 或更高版本。如果不是,请升级。

  1. 使用临时名称创建一个新表
  2. 填充新表(这是耗时的操作)
  3. 锁定您的生产表。
  4. 将生产表重命名为其他名称。
  5. 将您的临时表重命名为用于生产表的名称。
  6. 解锁生产表。
  7. 删除旧的生产表(或执行其他操作以重新使用磁盘空间)。

如果您可以使您使用的软件能够对抱怨缺少表的 SQL 错误进行读取,并且只需在一秒钟左右后再次尝试,您可以跳过锁定和解锁步骤。但是这些步骤可以保护您的系统免受短暂的影响,在重命名随机播放期间,没有具有正确名称的生产表的表。

这是猴子的生意,需要一些调试。但它对我来说效果很好。

(我将“猴子业务”定义为纯粹、优雅、SQL 范围之外的东西。)

于 2012-06-18T14:00:29.960 回答
1

您可以使用临时表名并向用户显示 VIEW。

步骤是:

于 2012-06-18T14:07:06.117 回答