Результаты кэширования таблицы для повышения производительности ... как? - PullRequest
4 голосов
/ 22 октября 2009

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

У меня есть несколько веб-страниц с таблицами HTML. Данные для этих таблиц HTML генерируются с использованием дорогих и сложных запросов MySQL. Я оптимизировал запросы настолько, насколько смог, и разместил индексы для повышения производительности. Проблема в том, что, если у меня высокий трафик на мой сайт, сервер MySQL забивается и испытывает трудности.

Интересно - данные в таблицах MySQL меняются не очень часто. Фактически, оно меняется только после определенного «события», которое происходит каждые несколько недель.

Итак, что я сделал сейчас, это:

  1. Сохранение HTML-таблицы после ее создания в файл
  2. При обращении к URL проверьте сохраненный файл, если он существует
  3. Если файл старше 1 часа, запустите запрос и сохраните новый файл, если не выводите файл

Это гарантирует, что для подавляющего большинства запросов страница загружается очень быстро, а данные могут быть не более 1 часа. Для моей цели это не так уж плохо.

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

Есть ли элегантный способ сделать это?

У меня нет ничего, кроме ванильного PHP и MySQL (последние версии) - я бы хотел поиграть с memcached, но не могу.

Ответы [ 4 ]

6 голосов
/ 22 октября 2009

ОК - серьезный ответ.

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

например. (псевдокод): On any update set last_updated.value = Time.now()

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

Если у вас нет уровня абстракции, создайте функцию-обертку для любого вызова обновления SQL, которая делает это, и всегда используйте функцию-обертку для любых будущих функций.

6 голосов
/ 22 октября 2009

Есть только две сложные вещи Информатика: аннулирование кэша и называть вещи.

- Фил Карлтон

Извините, не очень помогает, но это оооочень верно.

1 голос
/ 22 октября 2009

Большая часть концов покрыта, но поле last_modified и задание cron могут помочь.

Нет способа удалить файлы из MySQL, Postgres предоставит вам такую ​​возможность, но MySQL не сможет.

0 голосов
/ 22 октября 2009

Вы можете кэшировать свой вывод в строку, используя PHP функции буферизации вывода . Google it и вы найдете замечательную коллекцию сайтов, объясняющих, как это делается.

Мне интересно, однако, как вы узнаете, что данные истекают через час? Или вы предполагаете, что данные не изменятся так резко за 60 минут, чтобы гарантировать постоянную генерацию страниц?

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