当前位置:  开发笔记 > 编程语言 > 正文

如何判断MySQL表的上次更新时间?

如何解决《如何判断MySQL表的上次更新时间?》经验,为你挑选了6个好方法。

在我页面的页脚中,我想添加类似"上次更新xx/xx/200x"的内容,此日期是某个mySQL表最后一次更新的日期.

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



1> Alnitak..:

在MySQL的更高版本中,您可以使用information_schema数据库告诉您何时更新了另一个表:

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

这当然意味着打开与数据库的连接.


另一种选择是在MySQL表更新时"触摸"特定文件:

在数据库更新:

O_RDRW模式下打开时间戳文件

close 它再次

或者

使用函数touch()的PHP等价物utimes()来更改文件时间戳.

在页面显示:

用于stat()回读文件修改时间.


下面的`UPDATE_TIME`方法和`show table status`方法仅适用于MyISAM引擎,而不适用于InnoDB.虽然这被列为[bug](http://bugs.mysql.com/bug.php?id=15438),但在[MySQL 5.5 Reference](http://dev.mysql.com/)中提到了它. doc/refman/5.5/en/show-table-status.html),它还说`file_per_table`模式是修改时间的不可靠指标.
有关InnoDB限制的详细信息,请参阅http://dev.mysql.com/doc/refman/5.5/en/show-table-status.html(`show table status`使用`information_schema.tables`)
对于MySQL 5.7.2+,它[适用于InnoDB](https://dev.mysql.com/doc/refman/5.7/en/tables-table.html):"从MySQL 5.7.2开始,UPDATE_TIME显示一个在未分区的InnoDB表上执行的最后一次UPDATE,INSERT或DELETE的时间戳值.以前,UPDATE_TIME为InnoDB表显示NULL值.
再次,不能在InnoDB上工作,因为mysql是f**王车:http://bugs.mysql.com/bug.php?id = 14374
对我来说这似乎不会持续重启(在5.7.11版本上).
有没有办法在2018年获取InnoDB表的信息?

2> Radu Maris..:

我没有使用mysql 4.1.16版本的information_schema数据库,所以在这种情况下你可以查询:

SHOW TABLE STATUS FROM your_database LIKE 'your_table';

它将返回以下列:

| Name      | Engine | Version | Row_format | Rows | Avg_row_length 
| Data_length | Max_data_length | Index_length | Data_free | Auto_increment
| Create_time | Update_time | Check_time | Collation
| Checksum | Create_options | Comment |

正如你可以看到有一个名为列:" UPDATE_TIME ",显示你最后更新时间your_table.


它还执行更快(4x)然后SELECT语句

3> Bill Karwin..:

我很惊讶没有人建议跟踪每行的最后更新时间:

mysql> CREATE TABLE foo (
  id INT PRIMARY KEY
  x INT,
  updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 
                     ON UPDATE CURRENT_TIMESTAMP,
  KEY (updated_at)
);

mysql> INSERT INTO foo VALUES (1, NOW() - INTERVAL 3 DAY), (2, NOW());

mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x    | updated_at          |
+----+------+---------------------+
|  1 | NULL | 2013-08-18 03:26:28 |
|  2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+

mysql> UPDATE foo SET x = 1234 WHERE id = 1;

这会更新时间戳,即使我们没有在UPDATE中提及它.

mysql> SELECT * FROM foo;
+----+------+---------------------+
| id | x    | updated_at          |
+----+------+---------------------+
|  1 | 1235 | 2013-08-21 03:30:20 | <-- this row has been updated
|  2 | NULL | 2013-08-21 03:26:28 |
+----+------+---------------------+

现在您可以查询MAX():

mysql> SELECT MAX(updated_at) FROM foo;
+---------------------+
| MAX(updated_at)     |
+---------------------+
| 2013-08-21 03:30:20 |
+---------------------+

不可否认,这需要更多存储空间(TIMESTAMP每行4个字节).
但这适用于 5.7.15版MySQL之前的InnoDB表,INFORMATION_SCHEMA.TABLES.UPDATE_TIME但没有.


但是如果删除更新时间较短的记录,MAX(updated_at)将无效.
+1 As far as I'm concerned, this is the only right answer to this question. The question really wants to know when relevant data is updated, and not when a table (which is irrelevant to the user) may or may not have been changed for whatever reason.
@Ammamon,是的,如果你还需要考虑删除,这个解决方案并没有反映出来.更新摘要表的触发器可能是唯一全面的解决方案,但这会产生瓶颈.
对于大多数情况,知道删除不是那么相关,并且许多更高级别的aps并没有真正从许多表中删除,而只是取消设置等效的标志.

4> 小智..:

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

cd /var/lib/mysql/
ls -lhtr *.ibd

这应该为您提供所有表的列表,其中包含表在上次修改时的最早时间,第一个.



5> Francois Bou..:

有关最近表更改的列表,请使用以下命令:

SELECT UPDATE_TIME, TABLE_SCHEMA, TABLE_NAME
FROM information_schema.tables
ORDER BY UPDATE_TIME DESC, TABLE_SCHEMA, TABLE_NAME


您的UPDATE_TIME为空,因为您使用的是InnoDB而不是MyISAM.InnoDB通常是更好的选择,但它不支持UPDATE_TIME.
为什么我的所有`UPDATE_TIME`都为空?任何的想法?

6> Mikhail..:

我会创建一个触发器来捕获所有更新/插入/删除并在自定义表中写入时间戳,类似于tablename | 时间戳

仅仅因为我不喜欢直接读取db server的内部系统表的想法

推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有