MySQL - змушуйте не використовувати кеш для тестування швидкості запиту


343

Я тестую швидкість деяких запитів у MySQL. База даних кешує ці запити, що ускладнює отримання надійних результатів при тестуванні швидкості цих запитів.

Чи є спосіб відключити кешування запиту?

Система: MySQL 4 на веб-хостингу Linux, у мене є доступ до PHPMyAdmin.

Дякую

mysql 

Відповіді:


527

Спробуйте скористатися параметром SQL_NO_CACHE (MySQL 5.7) у вашому запиті. (Користувачі MySQL 5.6 натискають ТУТ )

напр.

SELECT SQL_NO_CACHE * FROM TABLE

Це зупинить кешування результатів MySQL, однак пам’ятайте, що інші кеші ОС та диска також можуть впливати на продуктивність. Їх важче обійти.



4
Приємна стаття про кеш запитів mysql. Як налаштувати та побачити кеш у дії! Варто прочитаного. databasejournal.com/features/mysql/article.php/3110171/…
Адріан П.

1
Перш ніж намагатися підвищити продуктивність, спробуйте перезапустити ваш сервер mysql. Можливо, якийсь процес впливає на все. Це сталося зі мною. Хоча це коментар, який не має прямого зв’язку з проблемою, він може допомогти багатьом.
dellasavia

2
Це не дозволяє йому кешувати результати, але чи не дозволяє йому використовувати кеш?
Бретт

3
@Brett дивіться коментар SalmanPK ще в 11 році. Ця сторінка doc - це буквально 4 пропозиції та безпосередньо відповідає на ваше запитання. У випадку, якщо сторінка буде видалена в майбутньому: "Вона ні перевіряє кеш запитів, щоб побачити, чи є результат вже кешований, ні кешує результат запиту."
maurice

121

Ще одна альтернатива, яка впливає лише на поточне з'єднання:

SET SESSION query_cache_type=0;

Моє ліжко. Це query_cache_sizeя дивився, ні query_cache_type. Я змішував вашу відповідь та відповідь SeniorDev.
Майк


30

Також є варіант конфігурації: query_cache_size = 0

Щоб відключити кеш запитів при запуску сервера, встановіть системну змінну query_cache_size на 0. Відключивши код кешу запитів, помітних накладних витрат не буде. Якщо ви будуєте MySQL з джерела, можливості кешування запитів можна повністю виключити з сервера, викликавши налаштування за допомогою параметра --without-query-cache.

Дивіться http://dev.mysql.com/doc/refman/5.1/uk/query-cache.html


24

Ви також можете виконати команду follow, щоб скинути кеш запитів.

RESET QUERY CACHE

9
Це, ймовірно, надмірність ... в ідеалі ви хочете, щоб MySQL тимчасово ігнорував кеш.
BMiner

3
Для цього вам також потрібні спеціальні дозволи.
Ерік Робертсон

19

Одна з проблем

SELECT SQL_NO_CACHE * FROM TABLE

метод полягає в тому, що він, здається, лише запобігає кешування результатів вашого запиту. Однак якщо ви запитуєте базу даних, яка активно використовується із запитом, який ви хочете протестувати, то інші клієнти можуть кешувати ваш запит, впливаючи на ваші результати. Я продовжую досліджувати способи цього, відредагую цю публікацію, якщо я розберу її.


1
Але якщо ваш кеш поповниться іншими, у вас з’явиться ілюзія швидкості. Але іноді ні.
karatedog

14

Я використовую наступне:

SHOW VARIABLES LIKE 'query_cache_type';
SET SESSION query_cache_type = OFF;
SHOW VARIABLES LIKE 'query_cache_type';

3

Використання визначеної користувачем змінної в межах запиту робить запит відновлюваним без керування. Я вважав це набагато кращим показником, ніж використання SQL_NO_CACHE. Але слід розмістити змінну там, де налаштування змінної не вплине серйозно на продуктивність:

SELECT t.*
FROM thetable t, (SELECT @a:=NULL) as init;

3
"Я вважав це набагато кращим показником, ніж використання SQL_NO_CACHE". Як так? Здається, вам знадобиться досить вагомий випадок для використання неясного злому явного ключового слова, якщо явне ключове слово не робить те, що вимагає.
Повітря

1
@Air Я знайшов це рішення працювати краще, ніж SQL_NO_CACHE. SQL_NO_CACHE вперше працював над запитом, але потім після цього він більше не працював. Я припускаю, що це пов'язано з іншими механізмами кешування. Я думаю, що це працює краще, тому що пошук, який спирається на змінну, не може кешуватися жодним шаром чи механізмом - принаймні, це найкраща здогадка.
Клік

2

Якщо ви хочете вимкнути кеш запиту, встановіть "query_cache_size" 0 у вашому файлі конфігурації mysql. Якщо його набір 0 mysql не буде використовувати кеш запитів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.