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

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

使用MyISAM,可以在修改表时预先计算Live校验和,而且非常快。但是,InnoDB中没有这样的东西。因此,CHECKSUM TABLE非常慢...

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

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

数据库生态系统由一个主节点和三个从节点组成,因此不能选择本地文件检查。
我想到了一种模拟校验和缓存的方法-具有两列的查找表-table_name,校验和,并在发生表更改时使用触发器更新该表,但是我要监视约100个表,这意味着每个表3个触发器= 300个触发器。很难维护,我不确定这不会再次成为性能 pig 。

那么,是否有任何FAST方法可以检测InnoDB表中的更改?

谢谢!

最佳答案

最简单的方法是添加类型为TIMESTAMP的可为空的列,并使用以下触发器: ON UPDATE CURRENT_TIMESTAMP

因此,插入将不会更改,因为该列接受空值,并且您可以通过说以下方式仅选择新的和更改的列:

SELECT * FROM `table` WHERE `mdate` > '2011-12-21 12:31:22'

每次更新一行时,此列都会自动更改。

以下是更多信息:http://dev.mysql.com/doc/refman/5.0/en/timestamp.html

要查看已删除的行,只需创建一个触发器即可将每次删除记录到另一个表中:
DELIMITER $$
CREATE TRIGGER MyTable_Trigger
AFTER DELETE ON MyTable
FOR EACH ROW
BEGIN
    INSERT INTO MyTable_Deleted VALUES(OLD.id, NOW());
END$$

关于MySQL-检查InnoDB表中数据是否已更改的最快方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8643018/

10-16 15:12
查看更多