在我的页脚,我想添加一些东西,如“上次更新xx/xx/200x”,这个日期是最后一次某个mySQL表已更新。

最好的方法是什么?是否有检索最近更新日期的函数?每次需要这个值时,我都应该访问数据库吗?


当前回答

虽然有一个公认的答案,但我不认为它是正确的答案。这是实现所需的最简单的方法,但即使已经在InnoDB中启用(实际上文档告诉你,你仍然应该得到NULL…),如果你阅读MySQL文档,即使在当前版本(8.0)使用UPDATE_TIME也不是正确的选择,因为:

方法重新启动服务器时,时间戳不会持久 表从InnoDB数据字典缓存中被清除。

如果我理解正确(现在不能在服务器上验证),时间戳在服务器重新启动后会重置。

至于真正的(以及昂贵的)解决方案,你有Bill Karwin的解决方案与CURRENT_TIMESTAMP,我想提出一个不同的解决方案,这是基于触发器(我正在使用那个)。

首先创建一个单独的表(或者可能有其他可以用于此目的的表),它将像存储全局变量(这里是时间戳)一样工作。您需要存储两个字段——表名(或者您想保留在这里作为表id的任何值)和时间戳。在你拥有它之后,你应该用这个表id +开始日期来初始化它(NOW()是一个很好的选择:))。

现在,你移动到你想要观察的表,并使用以下或类似的过程添加触发器AFTER INSERT/UPDATE/DELETE:

CREATE PROCEDURE `timestamp_update` ()
BEGIN
    UPDATE `SCHEMA_NAME`.`TIMESTAMPS_TABLE_NAME`
    SET `timestamp_column`=DATE_FORMAT(NOW(), '%Y-%m-%d %T')
    WHERE `table_name_column`='TABLE_NAME';
END

其他回答

如果您正在运行Linux,您可以使用inotify来查看表或数据库目录。inotify可以从PHP, node.js, perl和大多数其他语言中获得。当然,你必须安装inotify或让你的ISP安装它。很多ISP不会这么做。

当查询不可用时,将查询缓存在全局变量中。

创建一个网页,在更新缓存时强制重新加载缓存。

将对重新加载页面的调用添加到部署脚本中。

操作系统级别分析:

查找DB在磁盘上的存储位置:

grep datadir /etc/my.cnf
datadir=/var/lib/mysql

检查最近的修改

cd /var/lib/mysql/{db_name}
ls -lrt

应该适用于所有数据库类型。

在MySQL的新版本中,你可以使用information_schema数据库来告诉你什么时候另一个表被更新了:

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'dbname'
   AND TABLE_NAME = 'tabname'

这当然意味着打开到数据库的连接。


另一种选择是每当MySQL表更新时“触摸”一个特定的文件:

数据库更新:

以O_RDRW模式打开时间戳文件 再次关闭

或者

使用touch(),相当于PHP中的utimes()函数,来更改文件时间戳。

页面显示:

使用stat()读取文件修改时间。

最简单的方法是检查磁盘上表文件的时间戳。例如,您可以在数据目录下检查

cd /var/lib/mysql/<mydatabase>
ls -lhtr *.ibd

这将为您提供所有表的列表,其中的表是最后一次修改该表的时间、最早的时间。