Ускоряем работу сайта с помощью кэширования запросов MySQL

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

Механизм работы кэширования MySQL

Кэширование запросов в MySQL позволяет сохранять в оперативной памяти SELECT запросы и данные, полученные в результате их выполнения. При повторном таком же запросе, будут использованы закэшированные данные. При этом не будет необходимости повторно парсить и исполнять запрос, а также осуществлять доступ к жесткому диску. Что существенно может повысить скорость работы приложений, использующих MySQL.

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

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

Зато, если таблица не изменяется, ускорение получения данных может достигать 238%!

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

Результаты включения кэширования MySQL

На моем WordPress блоге удалось увеличить скорость загрузки страниц примерно в 3 раза. Есть замечательные плагины, которые позволяют просматривать все выполненные на странице запросы и показывают общее время их выполнения. Один из них Query Monitor.

Привожу скриншот данных от плагина до включения кэширования запросов:
Wordpress - MySQL кэширование включено

И после:
Wordpress - MySQL кэширование отключено

Как видно, значение ‘Database query time’ (указанное в секундах) уменьшилось втрое, соответственно блог стал быстрее работать. Конечно экономия в 6.3 миллисекунды (0.0092 — 0.0029 = 0.0063с = 6.3мс) кажется небольшой, но при большой посещаемости сайта и сканировании его поисковыми системами, она может быть существенной.

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

Включение кэширования в конфигурационном файле my.ini

Теперь о том, как включить кэширование. Для этого достаточно в конфигурационном файле MySQL my.ini добавить следующие строки:

query_cache_type = 1
query_cache_size = 16M
query_cache_limit = 1M

Важно, чтобы данные опции были добавлены в блок [mysqld], т.е. ниже данной строки, но перед следующим блоком — у меня это строка [mysqldump].

Опция query_cache_type включает кэширование запросов (по умолчанию установлена в 0); query_cache_size — задает размер памяти, выделяемой под закэшированные данные (по умолчанию 1М /мегабайт/); query_cache_limit — определяет максимальный размер закэшированных данных для каждого отдельного запроса, т.е. запросы, которые требует сохранения больших данных, чем позволяет данная опция, кэшироваться не будут (по умолчанию 1M).

Размер последних двух опций спокойно можно менять. Например, размер памяти под хранение кэша можно увеличить до 64 мегабайт:

query_cache_size = 64M

Но здесь есть предостережение — чрезмерно большой размер кэша будет замедлять работу MySQL, т.к. его необходимо постоянно перестраивать, что повышает нагрузку на сервер. Поэтому желательно ограничиться размером в 100 МБ.

Отправить ответ

Оставьте первый комментарий!

Подписаться на
avatar