mysql – 检查InnoDB表是否已更改的最快方法

我的应用程序非常密集数据库.目前,我正在运行MySQL 5.5.19并使用MyISAM,但我正在迁移到InnoDB.剩下的唯一问题是校验和性能.

我的应用程序在高峰时间每秒执行大约500-1000个CHECKSUM TABLE语句,因为客户端GUI不断轮询数据库以进行更改(它是一个监视系统,因此必须非常快速响应和快速).

使用MyISAM,有一些在表修改时预先计算的实时校验和非常快.但是,InnoDB中没有这样的东西.所以,CHECKSUM TABLE非常慢.

我希望能够检查表的最后更新时间,不幸的是,这在InnoDB中也不可用.我现在卡住了,因为测试表明应用程序的性能急剧下降.

有更多的代码行更新表,因此在应用程序中实现逻辑表更改是不可能的.

是否有任何快速方法来检测InnoDB表中的更改?

最佳答案
对于表mydb.mytable,运行以下查询:

SELECT update_time
FROM information_schema.tables
WHERE table_schema='mydb'
AND table_name='mytable';

如果您想知道最近5分钟内哪些表发生了变化,请运行以下命令:

SELECT table_schema,table_name,update_time
FROM information_schema.tables
WHERE update_time > (NOW() - INTERVAL 5 MINUTE);

试试看 !!!

更新2011-12-21 20:04美国东部时间

我的雇主(DB / Wweb托管公司)拥有一个拥有112,000个InnoDB表的客户.在高峰时段阅读INFORMATION_SCHEMA.TABLES非常困难.我有另一个建议:

如果启用了innodb_file_per_table并且所有InnoDB表都存储在.ibd文件中,则可以确定上次更新的时间(最新).

对于表mydb.mytable,请在操作系统中执行以下操作:

$cd /var/lib/mysql/mydb
$ls -l mytable.ibd | awk '{print $4,$5}'

此时间戳来自操作系统.你不能错过这个.

更新2011-12-21 22:04美国东部时间
    的[mysqld]
    innodb_max_dirty_pages_pct = 0;

将此添加到my.cnf,重新启动mysql,所有InnoDB表都将从缓冲池中快速刷新.

为避免重启,请运行

mysql> SET GLOBAL innodb_max_dirty_pages_pct=0;

更新2013-06-27 07:15美国东部时间

在检索文件的日期和时间时,ls具有–time-style选项:

$cd /var/lib/mysql/mydb
$ls -l --time-style="+%s" mytable.ibd | awk '{print $6}'

您可以将文件的时间戳与UNIX_TIMESTAMP(NOW())进行比较.

转载注明原文:mysql – 检查InnoDB表是否已更改的最快方法 - 代码日志