Mysql оптимізуємо query cache - mysql - блог корисних статей про розробку і розкручування сайтів

Mysql оптимізуємо query cache - mysql - блог корисних статей про розробку і розкручування сайтів
Query Cache кешує результати запиту. Це означає, що кеш запит не виконується зовсім. Більш того, кешування відпрацьовує навіть до розбору самого запиту. А це означає, що запит повинен бути точно таким же як в кеші, аж до байта.

За настройку кешування відповідають системні змінні починаються з 'query_cache_'

По-перше, переконаємося, що кешування включено. Мінлива query_cache_type повинна мати значення ON (1) або DEMAND (2) і query_cache_size бути відмінною від нуля.

При 'query_cache_type = ON' кешуються всі запити, крім містять хинт SQL_NO_CACHE і деяких винятків.
При 'query_cache_type = DEMAND' кешуються тільки запити починаються з SELECT SQL_CACHE.

query_cache_min_res_unit мінімальний розмір виділяється блоку пам'яті для зберігання результатів кешованого запиту. MySQL не зберігає кеш в одному великому шматку пам'яті, замість цього на вимогу виділяються блоки з мінімальним розміром query_cache_min_res_unit (= 4KB за замовчуванням). Останній такий блок обрізається до розміру даних, а решта пам'ять звільняється.
І якщо у вас багато невеликих запитів в кеші, то це може привести до фрагментації пам'яті через велику кількість вільних блоків. А це, в свою чергу, викликає видалення кешованих записів через нестачу пам'яті. В такому випадку має сенс зменшити значення query_cache_min_res_unit. Якщо більшість ваших запитів породжують великий результат, то збільшення цього параметра може підвищити продуктивність.

Для моніторингу query cache використовується

Query Cache використовується не завжди і не для всіх типів запитів. Якщо розмір результату запиту перевищує query_cache_limit (= 1MB за замовчуванням), то він не кешируєтся. MySQL до версії 4.1.1 не підтримує query cache в транзакціях.

  • Запити з тимчасовими таблицями або зовсім не використовують таблиці;
  • Запити генеруючі попередження (warnings);
  • Запити які є підзапитах зовнішнього запиту;
  • Запити всередині збережених процедур і функцій;
  • Запити з SQL_NO_CACHE
  • Підготовлені запити (Prepared statements);
  • Запити в яких використовуються функції:
    BENCHMARK (), CONNECTION_ID (), CONVERT_TZ (), CURDATE (), CURRENT_DATE (), CURRENT_TIME (), CURRENT_TIMESTAMP (), CURTIME (), DATABASE (), ENCRYPT () з одним аргументом, FOUND_ROWS (), GET_LOCK () , LAST_INSERT_ID (), LOAD_FILE (), MASTER_POS_WAIT (), NOW (), RAND (), RELEASE_LOCK (), SLEEP (), SYSDATE (), UNIX_TIMESTAMP () без аргументів, USER (), UUID ();
  • Запити використовують збережені функції, призначені для користувача змінні або посилаються на таблиці в системних базах mysql або INFORMATION_SCHEMA;
  • Запити мають такі форми:
    SELECT ... IN SHARE MODE
    SELECT ... FOR UPDATE
    SELECT ... INTO OUTFILE ...
    SELECT ... INTO DUMPFILE ...
    SELECT * FROM ... WHERE autoincrement_col IS NULL