Обнаружение изменения базы данных - PullRequest
1 голос
/ 22 августа 2011

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

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

Я суммирую размер и получаю "уникальное" число.Сравните его с предыдущим, и, если значения одинаковы, поставьте кэшированную страницу, если нет, запустите «нормальную» страницу, а затем кешируйте ее.У меня есть только 1 запрос к базе данных, и на основании этого доставить сайт (кэшированный или некэшированный в зависимости от результата) пользователю.

Может ли это сработать, а если нет - почему?

РЕДАКТИРОВАТЬ:

как насчет проверки на время последнего обновления? LINK

Ответы [ 5 ]

1 голос
/ 22 августа 2011

Кто обновляет базу? Предположим, что процесс , вызывающий изменение, должен сделать недействительным ваш кэш . Когда пользователь / администратор вызывает изменение в таблице, вы можете:

  • если администратор и общедоступный сайт совместно используют одно и то же пространство приложения (т. Е. Это одно и то же приложение), то просто обновите кэш в тот момент, когда администратор внесет изменение.
  • установить где-нибудь бит состояния (возможно, переменную сеанса) и периодически проверять, чтобы перезагрузить кэшированные данные.

Предполагаемый размер не является хорошим индикатором «произошли изменения». Забудьте строки - что если изменится значение bool / bit? Это удовлетворяло бы условию аннулирования кэша, но «размер» всегда был бы одинаковым. Вы могли бы улучшить это с помощью last-change-datetime, но у вас все еще остается та же основная проблема - запросить базу данных для проверки флага изменения. Вид поражения цели кеша.

Рассмотрим другой подход - обновлять кэш каждые n минут. Было ли изменение или нет, просто перезагрузите его. n будет значением, которое соответствует вашим бизнес-требованиям. Вы можете иметь устаревший кеш и обслуживать старые / устаревшие данные не более n минут. Это были бы не мои предложения, а то, что нужно учитывать.

0 голосов
/ 08 сентября 2011
SELECT max(UPDATE_TIME)
FROM information_schema.tables
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_SCHEMA = 'DB_NAME_GOES_HERE'

попробовал это, и это работает как шарм ....

0 голосов
/ 22 августа 2011

Вы можете CREATE TRIGGER s ПОСЛЕ ОБНОВЛЕНИЯ, ВСТАВКИ, УДАЛЕНИЯ и ЗАМЕНЫ В таблице, которую вы хотите отслеживать, вставляя CURRENT_TIMESTAMP () в какое-то поле состояния в отдельной таблице.В верхней части каждой страницы прочитайте это значение и сравните его с отметкой времени вашего кеша, если он старше вашего кеша, используйте кеш.

0 голосов
/ 22 августа 2011

Вы можете использовать это:

<?php

mysql_connect("localhost","root","");
$result = mysql_query("SHOW TABLE STATUS FROM test;");
while($array = mysql_fetch_array($result)) {
$total = $array[Data_length]+$array[Index_length];
echo '
Table: '.$array[Name].'<br />
Data Size: '.$array[Data_length].'<br />
Index Size: '.$array[Index_length].'<br />
Total Size: '.$total.'<br />
Total Rows: '.$array[Rows].'<br />
Average Size Per Row: '.$array[Avg_row_length].'<br /><br />
';
}

?> 
0 голосов
/ 22 августа 2011

Интересный подход.

Согласно http://dev.mysql.com/doc/refman/5.0/en/show-table-status.html, вы можете получить приблизительные значения для значений Data_length, а в примере ссылки были подозрительно круглые числа.Я определенно поэкспериментирую с этим еще раз, чтобы убедиться, что он делает то, что вы думаете.

Вы также должны убедиться, что это работает для обновлений, а не только для удаления / вставки.

Я бы также проверил производительность запроса «что-нибудь изменилось» в нетривиальной системе.Я предполагаю, что для того, чтобы это было точным, серверу БД нужно было бы посмотреть на файловую систему, которая, как я предполагаю, во много раз медленнее, чем запрашивать ее через SQL.

Во-вторых, в зависимости от базового приложения, вы можете обнаружить, что данные вашего приложения изменяются так часто, что вы постоянно аннулируете кэш.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...