Как быстро вычислить контрольную сумму таблицы MySQL InnoDB с миллионами записей

У меня есть таблицы на основе InnoDB, с которыми я могу проверить:

checksum table _table_name_

Это медленно, если в таблице находятся миллионы записей. Интересно, есть ли способ узнать, была ли таблица изменена или нет?

Мне нужно было что-то быстрое и дешевое в запросе, и меняющееся каждый раз, когда вносятся изменения в любую из записей таблицы. Я ничего не нахожу для таблиц InnoDB. Есть что-то?

С уважением Феликс


person GeorgieF    schedule 10.01.2012    source источник


Ответы (2)


Если у вас есть метка времени (скажем, LastUpdateTS) в таблице, созданной с настройками по умолчанию, и индекс для нее, то это должно быть довольно быстро. Он будет ловить только вставки и обновления, но не удаления:

SELECT MAX(LastUpdateTS)
FROM TableX

Из MySQL Docs, Timestamp Properties:

В операторе CREATE TABLE первый столбец TIMESTAMP может быть объявлен любым из следующих способов:

С предложениями DEFAULT CURRENT_TIMESTAMP и ON UPDATE CURRENT_TIMESTAMP столбец имеет текущую отметку времени для значения по умолчанию и автоматически обновляется.


Если вы хотите поймать любое изменение в таблице (включая удаления), триггер может быть лучшим решением. Каждый раз, когда оператор INSERT, UPDATE или DELETE действует на таблицу, триггер может обновить вспомогательную таблицу.

person ypercubeᵀᴹ    schedule 10.01.2012
comment
Спасибо за предложение. В случае большой нагрузки БД я не знаю, какое влияние окажут 3 дополнительных триггера. Поэтому я решил добавить столбец временных меток и включить количество строк таблицы, чтобы также реализовать действия по удалению. Это означает некоторые миграции, но, похоже, это лучший компромисс. - person GeorgieF; 10.01.2012

Более поздние версии MySQL сохраняют метку времени для каждого обновления таблицы:

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'dbname'
   AND TABLE_NAME = 'tabname'
person Niklas Lindblad    schedule 10.01.2012
comment
Это тоже кажется медленным и возвращает NULL для многих таблиц, где я не ожидал NULL. - person GeorgieF; 10.01.2012