我需要一种在不影响用户体验的情况下更新实时机器上的表的方法。
我在 MyISAM 引擎上有几张表,每 15 分钟更新一次。更新脚本只是截断表并从选择语句中插入数据。出现问题,然后用户尝试从正在更新的表中查看信息 - 用户体验滞后,显示不正确的信息。
使用 InnoDB 事务很容易,但是 MyISAM 呢?
正如你自己写的。转移到 InnoDB,或者解释是什么阻止了你这样做。
如果不能迁移到 InnoDB,我唯一能想到的就是在更新的时候加一层缓存。(例如 APC 或 memcached?)
你甚至可以写一些通常会跳过缓存的东西,当你开始一个更新周期时,将缓存中的当前内容设置为“遥远的未来”,从缓存中提供内容,并在更新完成时使它们失效。
额外的好处是你现在有一个工作缓存系统,也许让一切变得更快:)
如果你必须使用 myISAM,你可以尝试这种事情。您需要使用 5.0 或更高版本。如果不是,请升级。
如果您可以使您使用的软件能够对抱怨缺少表的 SQL 错误进行读取,并且只需在一秒钟左右后再次尝试,您可以跳过锁定和解锁步骤。但是这些步骤可以保护您的系统免受短暂的影响,在重命名随机播放期间,没有具有正确名称的生产表的表。
这是猴子的生意,需要一些调试。但它对我来说效果很好。
(我将“猴子业务”定义为纯粹、优雅、SQL 范围之外的东西。)
您可以使用临时表名并向用户显示 VIEW。
步骤是:
CREATE TABLE newtable
INSERT INTO newtable
CREATE OR REPLACE VIEW
DROP TABLE oldtable