2010-05-07 9 views
7

W przeszłości odniosłem sukces przechowując (mocno) przetworzone wyniki zapytania bazy danych w memcached, używając ostatniego czasu aktualizacji podstawowych tabel jako części klucza pamięci podręcznej. W przypadku tabel MyISAM ostatni zmieniony czas jest dostępny pod numerem SHOW TABLE STATUS. Niestety jest to zwykle NULL dla tabel InnoDB.Jak określić, kiedy tabela InnoDB była ostatnio zmieniana?

W MySQL 4.1, ctime dla InnoDB w jego linii SHOW TABLE STATUS było zwykle ostatnim czasem aktualizacji, ale nie wydaje się to być prawdziwe dla MySQL 5.1.

W tabeli znajduje się pole DATETIME, ale pokazuje ono tylko, kiedy wiersz został zmodyfikowany - nie może pokazać czasu usunięcia wiersza, którego już nie ma! Tak naprawdę nie mogę używać MAX(update_time).

Oto naprawdę trudna część. Mam wiele replik, z których czytam. Czy mogę określić stan tabeli, która nie jest zależna od tego, kiedy zmiany zostały faktycznie zastosowane?

Moja konkluzja po tym, jak nad tym popracowaliśmy, jest taka, że ​​nie będzie możliwe uzyskanie takich informacji tak tanio, jak bym chciał. Prawdopodobnie przechodzę do przechowywania danych w pamięci podręcznej do czasu, w którym oczekuję zmiany tabeli (jest ona aktualizowana raz dziennie), i niech pamięć podręczna zapytań pomaga tam, gdzie może.

Odpowiedz

8

To jest MySQL bug 14374, 15438, a także pod nr InnoDB bug 2681.

Mam dwie sugestie (inne niż łatanie MySQL).

  1. Jeśli używasz jednej tabeli na plik (innodb_file_per_table), ustaw plik bazowy. Możesz napisać funkcję/rozszerzenie MySQL, aby to zrobić. Może to być nieco opóźnione z powodu buforowania bazy danych.
  2. Można użyć po aktualizacji, usuwaniu i wstawianiu wyzwalaczy, aby zachować własną tabelę metadanych z ostatnimi czasami aktualizacji dla każdej tabeli, której dotyczy.

Osobiście sugeruję drugi, ponieważ jest bardziej przenośny i nie zależy od szczegółów implementacji (takich jak innodb_file_per_table).

+2

Pamiętaj, jeśli idzie o drogę 2.nd InnoDB wyzwala: "Uwaga Obecnie kaskadowane klucze obce nie aktywują wyzwalaczy." (od [13.2.2.5 ZAGRANICZNE KLUCZOWE NAKRĘTKI] (http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html)) –

11

Jeśli nie jesteś naprawdę zainteresowany, gdy baza danych została zmieniona, ale chcę wiedzieć, czy pogoda nie jedna tabela bazy danych została zmieniona należy spojrzeć na MySQL CHECKSUM TABLE

nadzieję, że to pomaga.

+0

Niesamowite, dokładnie to, czego potrzebowałem! – astgtciv

-1

Proponuję dodając kolejną kolumnę w tabeli i niech MySQL śledzić gdy stół był ostatnio modyfikowany, coś takiego:

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

Wyświetla się tylko wtedy, gdy określony wiersz został zaktualizowany. Chociaż można zrobić "WYBIERZ MAX (last_update) FROM table", może to dodać ogromną ilość narzutów dla tabeli z dużą liczbą wierszy tylko po to, aby uzyskać ostatnio zmodyfikowany czas –

Powiązane problemy