2010-05-07 57 views
7

我過去曾成功地在memcached中存儲數據庫查詢的(嚴重)處理結果,使用基礎表的最後一次更新時間作爲緩存鍵的一部分。對於MyISAM表格,最後更改的時間在SHOW TABLE STATUS。不幸的是,InnoDB表通常是NULL。如何確定InnoDB表最後一次更改的時間?

在MySQL 4.1中,InnoDB在其SHOW TABLE STATUS行中的ctime通常是其實際的最後更新時間,但對於MySQL 5.1似乎並不正確。

表中有一個DATETIME字段,但它只在行被修改時顯示 - 它不能顯示不存在的行的刪除時間!所以,我真的不能使用MAX(update_time)

這是非常棘手的部分。我有一些我從中讀取的副本。我可以計算出實際應用更改時不依賴的表的狀態嗎?

在我研究了一段時間之後,我的結論是不可能像我想的那樣便宜地獲取這些信息。我可能會緩存數據,直到我希望表更改(它每天更新一次),並讓查詢緩存幫助解決問題。

回答

8

這是MySQL bug 14374,15438和基礎InnoDB bug 2681

我有兩個建議(除了修補MySQL)。

  1. 如果您對每個文件(innodb_file_per_table)使用一個表,請統計底層文件。你可以寫一個MySQL函數/擴展來做到這一點。由於數據庫緩存,這可能略微滯後。
  2. 您可以在更新,刪除和插入觸發器後使用,以保留您自己的元數據表並使用您關心的每個表的上次更新時間。

我個人建議第二個,因爲它更便攜,不依賴於實現細節(如innodb_file_per_table)。

+2

記住,如果要在2.nd路線約InnoDB的觸發器: 「注意目前,級聯外鍵操作不激活觸發器。」 (來自[13.2.2.5。FOREIGN KEY Constraints](http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html)) – 2011-11-25 16:19:43

11

如果你不能當數據庫發生變化很感興趣,但想知道羯羊或不是一個數據庫表被改變,你應該看看到MySQL CHECKSUM TABLE

希望這有助於。

+0

真棒,正是我所需要的! – astgtciv 2014-03-29 10:53:57

-1

我建議增加另一列於表,讓MySQL的跟蹤,當表的最後修訂的,是這樣的:

ADD COLUMN `last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL 
+0

這僅在特定行更新時才顯示。雖然您可以執行「SELECT MAX(last_update)FROM表」,但這可能會爲具有大量行的表添加大量開銷,以便獲取最近修改的時間 – 2014-02-10 23:25:14

相關問題