За настройку кешування відповідають системні змінні починаються з '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