Mysql 如何确定InnoDB表上次更改的时间?
我曾经成功地将数据库查询的(经过大量处理的)结果存储在memcached中,并将基础表的上次更新时间作为缓存键的一部分。对于MyISAM表格,上次更改的时间可在Mysql 如何确定InnoDB表上次更改的时间?,mysql,innodb,Mysql,Innodb,我曾经成功地将数据库查询的(经过大量处理的)结果存储在memcached中,并将基础表的上次更新时间作为缓存键的一部分。对于MyISAM表格,上次更改的时间可在显示表格状态中找到。不幸的是,InnoDB表通常为空 在MySQL 4.1中,InnoDB在其SHOW TABLE STATUS行中的ctime通常是其实际的上次更新时间,但在MySQL 5.1中似乎并非如此 表中有一个DATETIME字段,但它只显示行被修改的时间-它不能显示不再存在的行的删除时间!所以,我真的不能使用MAX(更新时间)
显示表格状态中找到。不幸的是,InnoDB表通常为空
在MySQL 4.1中,InnoDB在其SHOW TABLE STATUS
行中的ctime通常是其实际的上次更新时间,但在MySQL 5.1中似乎并非如此
表中有一个DATETIME字段,但它只显示行被修改的时间-它不能显示不再存在的行的删除时间!所以,我真的不能使用MAX(更新时间)
这是真正棘手的部分。我有很多副本,我可以从中读取。我能找出不依赖于实际应用更改的时间的表的状态吗
经过一段时间的研究,我得出的结论是,不可能像我希望的那样以最低的成本获得这些信息。我可能会缓存数据,直到我希望表发生更改(每天更新一次)为止,并让查询缓存尽可能地提供帮助
我有两个建议(除了修补MySQL)
如果每个文件使用一个表(innodb\u file\u per\u table
),请统计底层文件。您可以编写一个MySQL函数/扩展来实现这一点。由于数据库缓存的原因,这可能会稍微滞后
可以使用“更新后”、“删除”和“插入”触发器来保存您自己的元数据表,其中包含您所关心的每个表的上次更新时间
我个人建议使用第二种方法,因为它更具可移植性,并且不依赖于实现细节(例如innodb_file_per_table
)。如果您对数据库何时更改并不感兴趣,但想知道是否有一个数据库表被更改,那么您应该查看MySQL
希望这能有所帮助。我建议在表中添加另一列,并让MySQL跟踪表上次修改的时间,如下所示:
ADD COLUMN `last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
我有来自mysql文档的解决方案
要确保stats innodb持久活动,请执行以下步骤:
使用检查innodb stats持久设置
检查mysql.innodb_table_stats中上次编辑的表
选择*
从mysql.innodb_表_stats
如果选择关于InnoDB触发器的第2条路线,请记住:“注意,当前,级联外键操作不会激活触发器。”(from)这仅在特定行更新时显示。虽然您可以从表中执行“SELECT MAX(last_update)”,但对于一个包含大量行的表来说,这可能会增加大量开销,只为了获得最新修改的timeAwesome,这正是我所需要的!慢。。。2万行这需要0.3秒,太糟糕了
SHOW VARIABLES like 'innodb_stats_persistent';
# Should result is ON.