在活机上更新MyISAM表(MySQL)

时间:2012-06-18 13:43:28

标签: mysql sql myisam

我需要一种方法来更新实时计算机上的表,而不会影响用户体验。

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

使用InnoDB交易很容易,但MyISAM呢?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

您甚至可以编写通常会跳过缓存的内容,并且当您启动更新周期时,将缓存中的当前内容设置为“远期到期”,从缓存中提供内容,并在更新时使其无效完了。

增加的优势是您现在拥有一个可用的缓存系统,可能使一切更快:)

答案 2 :(得分:1)

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

  1. 使用临时名称
  2. 创建一个新表
  3. 填充新表(这是一项耗时的操作)
  4. 锁定您的生产表。
  5. 将生产表重命名为其他内容。
  6. 将临时表重命名为用于生产表的名称。
  7. 解锁生产表。
  8. 删除旧的生产表(或执行其他操作以重新使用磁盘空间)。
  9. 如果您可以使用您正在使用的软件来阅读这个有弹性的SQL错误,该错误会导致丢失表,并且只需在一秒左右后重试,您可以跳过锁定和解锁步骤。但是这些步骤可以保护您的系统免受短时间的影响,在重命名shuffle期间,没有生产表正确名称的表。

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

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

答案 3 :(得分:1)

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

步骤如下: