2010-05-07 12 views
7

Ich hatte in der Vergangenheit erfolgreich die (stark) verarbeiteten Ergebnisse einer Datenbankabfrage in memcached gespeichert, wobei die letzte Aktualisierungszeit der zugrunde liegenden Tabellen als Teil des Cache-Schlüssels verwendet wurde. Für MyISAM-Tabellen ist die zuletzt geänderte Zeit in SHOW TABLE STATUS verfügbar. Leider ist das für InnoDB-Tabellen normalerweise NULL.Wie kann ich feststellen, wann eine InnoDB-Tabelle zuletzt geändert wurde?

In MySQL 4.1 war die ctime für eine InnoDB in seiner SHOW TABLE STATUS Zeile in der Regel die tatsächliche letzte Update-Zeit, aber das scheint nicht wahr zu sein für MySQL 5.1.

Es gibt ein DATETIME-Feld in der Tabelle, aber es wird nur angezeigt, wenn eine Zeile geändert wurde - es kann nicht die Löschzeit einer Zeile angezeigt werden, die nicht mehr vorhanden ist! Also kann ich wirklich MAX(update_time) nicht verwenden.

Hier ist der wirklich knifflige Teil. Ich habe eine Reihe von Repliken, von denen ich lese. Kann ich den Status der Tabelle herausfinden, der nicht darauf angewiesen ist, wann die Änderungen tatsächlich angewendet wurden?

Meine Schlussfolgerung nach der Arbeit für eine Weile ist, dass es nicht möglich sein wird, diese Informationen so billig zu bekommen, wie ich möchte. Ich werde wahrscheinlich Daten bis zu dem Zeitpunkt zwischenspeichern, zu dem ich erwarte, dass sich die Tabelle ändert (es wird einmal am Tag aktualisiert), und der Abfragecache kann helfen, wo es möglich ist.

Antwort

8

Dies ist MySQL bug 14374, 15438 und zugrunde liegenden InnoDB bug 2681.

Ich habe zwei Vorschläge (außer Patchen MySQL).

  1. Wenn Sie eine Tabelle pro Datei verwenden (innodb_file_per_table), schreiben Sie die zugrunde liegende Datei. Sie könnten dazu eine MySQL-Funktion/Erweiterung schreiben. Dies kann aufgrund des Zwischenspeicherns der Datenbank etwas verzögert sein.
  2. Sie können nach dem Aktualisieren, Löschen und Einfügen von Triggern Ihre eigene Metadatentabelle mit den letzten Aktualisierungszeiten für jede Tabelle, die Sie betreffen, behalten.

Ich persönlich würde die zweite vorschlagen, da es viel portabler ist und nicht auf Implementierungsdetails (wie innodb_file_per_table) abhängt.

+2

Beachten Sie, wenn das Gehen den 2.ten Route über InnoDB auslöst: "Hinweis Derzeit kaskadierte Fremdschlüsselaktionen aktivieren keine Trigger." (aus [13.2.2.5. FOREIGN KEY Constraints] (http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html)) –

11

Wenn Sie nicht wirklich interessiert, wenn die Datenbank geändert wurde, sondern wollen wissen, ob oder nicht eine Datenbanktabelle geändert wurde Sie in MySQL aussehen sollte CHECKSUM TABLE

Hoffnung, das hilft.

+0

Ehrfürchtig, genau was ich brauchte! – astgtciv

-1

Ich würde vorschlagen, eine andere Spalte in der Tabelle hinzugefügt und lassen MySQL verfolgen, wenn die Tabelle zuletzt geändert wurde, so etwas wie dieses:

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

Dies wird nur angezeigt, wenn eine bestimmte Zeile aktualisiert wurde. Sie könnten zwar eine "SELECT MAX (last_update) FROM-Tabelle" erstellen, dies könnte jedoch für eine Tabelle mit einer großen Anzahl von Zeilen einen enormen Aufwand verursachen, nur um die zuletzt geänderte Zeit zu erhalten –

Verwandte Themen