Как я могу определить, когда таблица InnoDB была изменена в последний раз?

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

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

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

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

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


person David M    schedule 07.05.2010    source источник


Ответы (4)


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

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

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

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

person derobert    schedule 07.05.2010
comment
Имейте в виду, если идете по второму маршруту о триггерах InnoDB: Примечание. В настоящее время каскадные действия внешнего ключа не активируют триггеры. (из 13.2.2.5. Ограничения FOREIGN KEY< /а>) - person Peter V. Mørch; 25.11.2011

Если вас не очень интересует, когда была изменена база данных, но вы хотите знать, была ли изменена одна таблица базы данных, вам следует заглянуть в MySQL КОНТРОЛЬНАЯ ТАБЛИЦА

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

person titel    schedule 16.03.2011
comment
Круто, именно то, что мне было нужно! - person astgtciv; 29.03.2014
comment
Медленно... 20 тыс. строк занимает 0,3 секунды, просто ужасно - person Martin Zvarík; 14.02.2019

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

ADD COLUMN `last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
person crmpicco    schedule 30.10.2012
comment
Это отображается только при обновлении определенной строки. Хотя вы можете выполнить SELECT MAX(last_update) FROM table, это может добавить огромное количество накладных расходов для таблицы с большим количеством строк только для получения времени последнего изменения. - person Matthew Kolb; 11.02.2014

У меня есть решение из документации mysql https://dev.mysql.com/doc/refman/5.6/en/innodb-persistent-stats.html Шаг, чтобы убедиться, что статистика innodb постоянна активна:

  1. Проверьте постоянные настройки innodb stats с помощью
SHOW VARIABLES like 'innodb_stats_persistent';

# Should result is ON.
  1. Проверьте последнюю отредактированную таблицу из mysql.innodb_table_stats
SELECT *
FROM mysql.innodb_table_stats
person Pamungkas Jayuda    schedule 06.01.2021