Как определить, когда таблица InnoDB последний раз изменялась? - PullRequest
10 голосов
/ 07 мая 2010

В прошлом я успешно сохранял (сильно) обработанные результаты запроса к базе данных в memcached, используя время последнего обновления базовых таблиц в качестве части ключа кэша. Для таблиц MyISAM это последнее измененное время доступно в SHOW TABLE STATUS. К сожалению, это обычно NULL для таблиц InnoDB.

В MySQL 4.1 ctime для InnoDB в его строке SHOW TABLE STATUS обычно было фактическим временем последнего обновления, но, похоже, это не так для MySQL 5.1.

В таблице есть поле DATETIME, но оно показывает только то, когда строка была изменена - оно не может показать время удаления строки, которой больше нет! Итак, я действительно не могу использовать MAX(update_time).

Вот действительно сложная часть. У меня есть ряд реплик, с которых я читаю. Могу ли я определить состояние таблицы, которая не зависит от фактического применения изменений?

Мой вывод, после некоторой работы над этим, заключается в том, что получить такую ​​информацию дешевле, чем мне хотелось бы, не представляется возможным. Я, вероятно, собираюсь кэшировать данные до того времени, когда я ожидаю, что таблица изменится (она обновляется один раз в день), и позволю кешу запросов помочь, где это возможно.

Ответы [ 3 ]

15 голосов
/ 16 марта 2011

Если вас не очень интересует, когда база данных была изменена, но вы хотите знать, была ли изменена или нет одна таблица базы данных, вам следует заглянуть в MySQL CHECKSUM TABLE

Надеюсь, это поможет.

11 голосов
/ 07 мая 2010

Это ошибка MySQL 14374 , 15438 и базовая ошибка InnoDB 2681 .

У меня есть два предложения (кроме исправления MySQL).

  1. Если вы используете одну таблицу на файл (innodb_file_per_table), укажите базовый файл. Вы можете написать функцию / расширение MySQL для этого. Это может немного отставать из-за кэширования базы данных.
  2. Вы можете использовать триггеры после обновления, удаления и вставки, чтобы сохранить собственную таблицу метаданных с последним временем обновления для каждой интересующей вас таблицы.

Я бы лично предложил второй вариант, так как он гораздо более переносим и не зависит от деталей реализации (например, innodb_file_per_table).

0 голосов
/ 30 октября 2012

Я бы предложил добавить еще один столбец в таблицу и позволить MySQL отслеживать, когда таблица последний раз изменялась, что-то вроде этого:

ADD COLUMN `last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
...