如何确定InnoDB表的上次更改时间?

时间:2010-05-07 00:25:40

标签: mysql innodb

过去我成功地将数据库查询的(重度)处理结果存储在memcached中,使用基础表的最后更新时间作为缓存键的一部分。对于MyISAM表,SHOW TABLE STATUS中提供了上次更改的时间。不幸的是,InnoDB表通常为NULL。

在MySQL 4.1中,InnoDB在其SHOW TABLE STATUS行中的ctime通常是其实际的最后更新时间,但对于MySQL 5.1来说似乎并非如此。

表中有一个DATETIME字段,但它只显示修改行的时间 - 它不能显示不再存在的行的删除时间!所以,我真的不能使用MAX(update_time)

这是非常棘手的部分。我有许多复制品,我从中读取。我能否找出实际应用更改时不依赖的表的状态?

我在做了一段时间后的结论是,我不可能像我想的那样便宜地获得这些信息。我可能会暂时缓存数据,直到我希望表更改(它每天更新一次)为止,并让查询缓存帮助它尽可能地帮助。

4 个答案:

答案 0 :(得分:15)

如果您在更改数据库时并不感兴趣,但想知道某个数据库表是否已更改,则应查看MySQL CHECKSUM TABLE

希望这有帮助。

答案 1 :(得分:11)

这是MySQL bug 1437415438和基础InnoDB bug 2681

我有两个建议(除了修补MySQL)。

  1. 如果您为每个文件使用一个表(innodb_file_per_table),请对基础文件进行统计。您可以编写MySQL函数/扩展来执行此操作。由于数据库缓存,这可能会略有滞后。
  2. 您可以在更新,删除和插入触发器后使用,以使您自己的元数据表与您关注的每个表的最后更新时间保持一致。
  3. 我个人建议第二个,因为它更易于移植,并且不依赖于实现细节(例如innodb_file_per_table)。

答案 2 :(得分:0)

我建议在表中添加另一列,让MySQL跟踪上次修改表的时间,如下所示:

ADD COLUMN `last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL

答案 3 :(得分:0)

我有来自文档 mysql https://dev.mysql.com/doc/refman/5.6/en/innodb-persistent-stats.html 的解决方案 有步骤可以确保 stats innodb 持续活动:

  1. 使用
  2. 检查innodb stats持久设置
SHOW VARIABLES like 'innodb_stats_persistent';

# Should result is ON.
  1. 从 mysql.innodb_table_stats 检查上次编辑的表
SELECT *
FROM mysql.innodb_table_stats