Главная страница / Советы / MySQL кеширование
февраль 07 2009

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

celsoft 7 февраля 2009 Советы 25 668
Дорогие друзья,

в этой статье мы хотим рассказать вам о том как можно снизить нагрузку на 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 часа. Включение данной опции позволяет сэкономить процессорное время для больших сайтов.

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

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

Комментарии

  1. RedScorp (Клиенты)

    7 февраля 2009 14:35 10 комментариев
    Спасибо!
  2. eargonx (Клиенты)

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

    7 февраля 2009 17:07 1 комментарий
    Полезная информация, спасибо
  4. celsoft (Администраторы)

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

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

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

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

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

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

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

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

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

    9 февраля 2009 00:13 18 комментариев
    Кэширование включенно, но при попытке посмотреть 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


    Как быть?
  9. celsoft (Администраторы)

    9 февраля 2009 01:34 3 371 комментарий
    C-WEST,
    запрос выполнять нужно с правами суперпользователя, т.е. под root правами
  10. C-WEST (Клиенты)

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

    Эм, а почему show variables like 'query_cache%'; выполнился?
  11. celsoft (Администраторы)

    9 февраля 2009 02:45 3 371 комментарий
    Потому что один запрос показывает значение переменной, второй глобальный статус
  12. C-WEST (Клиенты)

    11 февраля 2009 21:06 18 комментариев
    Собственно я и выполняю из под root'а (
  13. CAPA.ru (Посетители)

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


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

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

    show variables like 'cache%';

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

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

    это где?? я не нашел no
  15. LonerD (Посетители)

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

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

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

    Присоединяюсь к вопросу
  17. celsoft (Администраторы)

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

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

Информация

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

Календарь

«    Июль 2020    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
2728293031 

Опрос на сайте

Совершаете ли вы покупки в интернет?