Получить md5 / sha1 хэш данных таблиц mysql?

#php #mysql #sql

#php #mysql #sql

Вопрос:

Короче говоря, в глобально включенном конфигурационном файле я беру настройки из таблицы и определяю константу в своем коде с помощью settingKey, settingVal из таблицы базы данных, теперь я не думаю, что это так много накладных расходов, однако, если у меня получилось много настроек, было бы лучше проверить, изменились ли они, и если да, то определить их, в противном случае нет.

Итак, в итоге, должен ли я / могу ли я получить хэш таблицы и сравнить его с последним известным хэшем таблицы, чтобы увидеть, изменились ли значения? Или я иду по этому совершенно неправильному пути, и есть более эффективный метод?

Спасибо!

Ответ №1:

Создайте триггер, который записывает в таблицу журнала время последнего обновления и т.д.

 CREATE TABLE LOG (
  id integer PRIMARY KEY AUTOINCREMENT,
  tablename varchar NOT NULL,
  action ENUM('insert','delete','update') NOT NULL,
  action_time DATETIME NOT NULL)

DELIMITER $$

CREATE TRIGGER ai_table1 AFTER INSERT ON table1
BEGIN
  INSERT INTO log (id, tablename, action, action_time)
     VALUES (null, 'table1', 'insert', NOW())
END$$

CREATE TRIGGER ad_table1 AFTER DELETE ON table1
BEGIN
  INSERT INTO log (id, tablename, action, action_time)
     VALUES (null, 'table1', 'delete', NOW())
END$$

CREATE TRIGGER au_table1 AFTER UPDATE ON table1
BEGIN
  INSERT INTO log (id, tablename, action, action_time)
     VALUES (null, 'table1', 'update', NOW())
END$$

DELIMITER ;
  

Обратите внимание, что триггер не срабатывает FOR EACH ROW , потому что вам нужна только дата любого изменения, и это делает триггеры немного быстрее (и журнал немного короче) при выполнении нескольких обновлений / удалений / вставок.

Ссылки:
Триггеры:http://dev.mysql.com/doc/refman/5.1/en/triggers.html

Комментарии:

1. Включают ли INSERT триггеры UPDATE и REPLACE запросы?

2. @DanFromGermany Replace преобразуется во вставку или обновление по мере необходимости. Если replace выполняет обновление, это вызовет триггер обновления, если он выполняет insert, это вызовет этот триггер. Очевидно, что нет replace триггера. Правильный триггер для использования определяется на основе каждой строки.

Ответ №2:

Временная метка была бы намного проще, например

 SELECT * FROM table WHERE last_modified > somedate
  

MySQL даже автоматически обновит столбец last_modified следующим образом:

 ALTER TABLE table
    ADD last_modified TIMESTAMP 
        DEFAULT CURRENT_TIMESTAMP 
        ON UPDATE CURRENT_TIMESTAMP;
  

Затем в любое время, когда вы будете настраивать свои настройки, просто обратите внимание на временную метку и используйте ее в следующий раз, когда вам нужно будет проверить.

Ответ №3:

Ну, лучше где-нибудь кэшировать настройки (в файле, в memcached или в APC) и просто аннулировать кэш, если какая-то настройка изменена.

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