/ / MySQL кеширование
февраль 07 2009

MySQL кеширование

Дорогие друзья,

в этой статье мы хотим рассказать вам о том как можно снизить нагрузку на MySQL сервер, при этом не прибегая к настройкам самого скрипта. Речь сегодня пойдет о таких возможностях MySQL как кеширование результатов запросов. Кеширование запросов позволяет увеличить производительность веб приложений, не внося при этом каких то конструктивных изменений в сами приложения. Суть его работы состоит в том что он запоминает результаты запросов в оперативной памяти и при повторном запросе, он не выполняет запрос, а просто сразу отдает результаты из кеша. По умолчанию кеширование в MySQL отключено, поэтому включить его смогут не все, а только пользователи имеющие возможность выполнения запросов от имени суперпользователя MySQL или имеющие доступ к конфигурационным файлам MySQL сервера. Но этого и достаточно, т.к. MySQL кеширование эффективно только для высокопосещаемых проектов, а они как правило имеют VPS тарифы где доступ к настойкам есть, либо собственные сервера. Если ваш проект имеет небольшую посещаемость, то в принципе вам это не нужно, т.к. особой заметной эффективности вы не добьетесь.

MySQL содержит встроенный механизм кэширования запросов, который, не включен по умолчанию. Для получения состояния о кешировании, выполните в phpMyAdmin запрос:
show variables like 'query_cache%';

В результате вы получите таблицу примерно следующего содержания:
+-------------------------------------+---------+
| Variable_name                           | Value   |
+-------------------------------------+---------+
| query_cache_limit                     | 1048576 | 
| query_cache_min_res_unit       | 4096      | 
| query_cache_size                     | 0            | 
| query_cache_type                    | ON        | 
| query_cache_wlock_invalidate | OFF       | 
+------------------------------------+---------+

где query_cache_size показывает размер оперативной памяти выделенного под кеш запросов. Для того чтобы включить кэш запросов и выделить под него 16 мегабайт памяти необходимо выполнить запрос:
SET @@global.query_cache_size=16777216;

Запрос необходимо выполнять с правами суперпользователя, а если вы хотите сделать данную настройку постоянной, следует добавить в my.cnf в подраздел [mysqld] строчку:
query_cache_size=16M.

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

Для проверки состяния кеша необходимо выполнить следующий запрос:
SHOW GLOBAL STATUS LIKE 'Qcache%';

Результатом будет таблица примерно следующего содержания:
Qcache_free_blocks           570
Qcache_free_memory        13454680
Qcache_hits                        111749 
Qcache_inserts                   168162 
Qcache_lowmem_prunes     0
Qcache_not_cached            38651 
Qcache_queries_in_cache   1290 
Qcache_total_blocks           3314

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

Внимание для эффективности MySQL кеширования в DLE необходимо в настройках скрипта в разделе оптимизации включить опцию:
Кешировать счетчик просмотров новостей
Если 'Нет', то счетчик просмотров новостей будет обновляться с каждым просмотром. Если 'Да', количество просмотров будет записываться в другую таблицу и обновляться каждые 4 часа. Включение данной опции позволяет сэкономить процессорное время для больших сайтов.

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

Вот собственно и все.

Комментарии

RedScorp

RedScorp

7 февраля 2009 14:35 Клиенты
0
Спасибо!
eargonx

eargonx

7 февраля 2009 17:00 Клиенты
0
скажите, если у меня посещаемость 15-16к, мне стоит это делать или нет?
Как я понял, без включения счетчика просмотров новостей этот метод будет безсмыслен?
TAV

TAV

7 февраля 2009 17:07 Клиенты
0
Полезная информация, спасибо
celsoft

celsoft

7 февраля 2009 18:29 Администраторы
1
Цитата: eargonx
скажите, если у меня посещаемость 15-16к, мне стоит это делать или нет?

да
Цитата: eargonx
Как я понял, без включения счетчика просмотров новостей этот метод будет безсмыслен?

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

eargonx

7 февраля 2009 20:23 Клиенты
0
Все вы не поняли, читайте внимательно еще раз. Если включен счетчик то нужно включить его кеширование в скрипте, если он не включен и не используется то еще лучше, вообще ничего делать не нужно в скрипте.

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

celsoft

7 февраля 2009 21:03 Администраторы
0
eargonx,
В таком случая нет смысла т.к. каждый просмотр полной новости будет обнулять кеш таблицы новостей
Medik18

Medik18

8 февраля 2009 23:16 Клиенты
0
Цитата: celsoft
В таком случая нет смысла т.к. каждый просмотр полной новости будет обнулять кеш таблицы новостей

Может стоит посоветовать "шлифануть" скрипт, что бы обновляло хотя бы раз в 30 минут, или в 15 минут... 4 часа не для каждого приемлемо...

По сабжу: Данные настройки уже стоят на сервере, но за мануал спасибо.
Буду проверять Qcache_lowmem_prunes.
C-WEST

C-WEST

9 февраля 2009 00:13 Клиенты
0
Кэширование включенно, но при попытке посмотреть SHOW GLOBAL STATUS LIKE 'Qcache%'; выдаёт ошибку:

Ошибка

SQL-запрос:

SHOW GLOBAL STATUS LIKE 'Qcache%'

Ответ MySQL:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'STATUS LIKE 'Qcache%'' at line 1


Как быть?
celsoft

celsoft

9 февраля 2009 01:34 Администраторы
0
C-WEST,
запрос выполнять нужно с правами суперпользователя, т.е. под root правами
C-WEST

C-WEST

9 февраля 2009 02:21 Клиенты
0
Цитата: celsoft
запрос выполнять нужно с правами суперпользователя, т.е. под root правами

Эм, а почему show variables like 'query_cache%'; выполнился?
celsoft

celsoft

9 февраля 2009 02:45 Администраторы
0
Потому что один запрос показывает значение переменной, второй глобальный статус
C-WEST

C-WEST

11 февраля 2009 21:06 Клиенты
0
Собственно я и выполняю из под root'а (
CAPA.ru

CAPA.ru

17 февраля 2009 09:18 Посетители
0
Цитата: celsoft
C-WEST,запрос выполнять нужно с правами суперпользователя, т.е. под root правами


не путайте людей! данная команда выполняется ТОЛЬКО НА MySql версии 5 и выше.
на 4 - 4.1 (которая скорее всего установлена у C-West) эта команда не работает и никак не заработает.

используйте только:

show variables like 'cache%';

(!) фильтр убивает команду... вводить в кавычках процентКЭШпроцент
derkul

derkul

23 марта 2009 21:28 Посетители
0
следует добавить в my.cnf в подраздел [mysqld] строчку:

это где?? я не нашел no
LonerD

LonerD

5 апреля 2011 16:00 Посетители
0
Если 'Да', количество просмотров будет записываться в другую таблицу и обновляться каждые 4 часа.

Где можно изменить эту настройку, например, на 1 час или 30 минут?
mishaber

mishaber

17 ноября 2011 20:38 Посетители
0
Цитата: LonerD
Где можно изменить эту настройку, например, на 1 час или 30 минут?

Присоединяюсь к вопросу
celsoft

celsoft

17 ноября 2011 23:00 Администраторы
0
каких либо настроек по данному вопросу в скрипте нет. Необходимо править файлы скрипта в частности engine/init.php, кстати в актуальный версиях время кеширования счетчика два часа, а не четыре.
KillerHT

KillerHT

3 декабря 2012 08:19 Посетители
0
Спасибо за совет/статью.

Информация

Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Календарь
«    Декабрь 2017    »
ПнВтСрЧтПтСбВс
 123
45678910
11121314151617
18192021222324
25262728293031
Опрос на сайте
Совершаете ли вы покупки в интернет?

Популярные новости
Архив новостей
Ноябрь 2017 (3)
Сентябрь 2017 (2)
Август 2017 (5)
Июль 2017 (1)
Июнь 2017 (1)
Апрель 2017 (3)