过去我成功地将数据库查询的(重度)处理结果存储在memcached中,使用基础表的最后更新时间作为缓存键的一部分。对于MyISAM表,SHOW TABLE STATUS
中提供了上次更改的时间。不幸的是,InnoDB表通常为NULL。
在MySQL 4.1中,InnoDB在其SHOW TABLE STATUS
行中的ctime通常是其实际的最后更新时间,但对于MySQL 5.1来说似乎并非如此。
表中有一个DATETIME字段,但它只显示修改行的时间 - 它不能显示不再存在的行的删除时间!所以,我真的不能使用MAX(update_time)
。
这是非常棘手的部分。我有许多复制品,我从中读取。我能否找出实际应用更改时不依赖的表的状态?
我在做了一段时间后的结论是,我不可能像我想的那样便宜地获得这些信息。我可能会暂时缓存数据,直到我希望表更改(它每天更新一次)为止,并让查询缓存帮助它尽可能地帮助。
答案 0 :(得分:15)
如果您在更改数据库时并不感兴趣,但想知道某个数据库表是否已更改,则应查看MySQL CHECKSUM TABLE
希望这有帮助。
答案 1 :(得分:11)
这是MySQL bug 14374,15438和基础InnoDB bug 2681。
我有两个建议(除了修补MySQL)。
innodb_file_per_table
),请对基础文件进行统计。您可以编写MySQL函数/扩展来执行此操作。由于数据库缓存,这可能会略有滞后。我个人建议第二个,因为它更易于移植,并且不依赖于实现细节(例如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 持续活动:
SHOW VARIABLES like 'innodb_stats_persistent';
# Should result is ON.
SELECT *
FROM mysql.innodb_table_stats