MySQL - заставить не использовать кеш для тестирования скорости запроса

343

Я тестирую скорость некоторых запросов в MySQL. База данных кэширует эти запросы, что затрудняет получение надежных результатов при тестировании скорости выполнения этих запросов.

Есть ли способ отключить кеширование для запроса?

Система: MySQL 4 на хостинге Linux, у меня есть доступ к PHPMyAdmin.

Спасибо


источник

Ответы:

527

Попробуйте использовать опцию SQL_NO_CACHE (MySQL 5.7) в своем запросе. (Пользователи MySQL 5.6 нажимают ЗДЕСЬ )

например.

SELECT SQL_NO_CACHE * FROM TABLE

Это остановит MySQL кеширование результатов, однако имейте в виду, что другие ОС и дисковые кеши могут также влиять на производительность. Это сложнее обойти.

Джарод Эллиотт
источник
5
Документация
Салман фон Аббас
4
Хорошая статья о MySQL Query кеш. Как настроить и увидеть кеш в действии! Стоит прочитать. databasejournal.com/features/mysql/article.php/3110171/…
Адриан П.
1
Прежде чем пытаться улучшить производительность, попробуйте перезапустить сервер MySQL. Может быть, какой-то процесс влияет на все. Это случилось со мной. Хотя это комментарий, который не имеет прямого отношения к проблеме, он может помочь многим людям.
dellasavia
2
Это останавливает кеширование результатов, но не мешает ли оно использовать кеш?
Бретт
3
@ Бретт видит комментарий SalmanPK еще в 11 году. Эта страница документа буквально состоит из 4 предложений и отвечает на ваш вопрос напрямую. В случае, если страница будет удалена в будущем: «Она не проверяет кэш запроса, чтобы увидеть, кеширован ли уже результат, и не кеширует результат запроса».
Морис
121

Еще одна альтернатива, которая влияет только на текущее соединение:

SET SESSION query_cache_type=0;
Джон Картер
источник
Виноват. Это query_cache_sizeя смотрел, а не query_cache_type. Я перепутал ваш ответ с ответом SeniorDev.
Майк
30

Также есть опция конфигурации: query_cache_size = 0

Чтобы отключить кэш запросов при запуске сервера, задайте для системной переменной query_cache_size значение 0. Отключив код кеша запросов, заметных накладных расходов не будет. Если вы строите MySQL из исходного кода, возможности кэширования запросов можно полностью исключить из сервера, вызвав команду configure с параметром --without-query-cache.

См. Http://dev.mysql.com/doc/refman/5.1/en/query-cache.html.

barbushin
источник
24

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

RESET QUERY CACHE
DJT
источник
9
Это, вероятно, излишне ... в идеале, вы хотите, чтобы MySQL только временно игнорировал кеш.
BMiner
3
Вам также нужны специальные разрешения для этого.
Эрик Робертсон
19

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

SELECT SQL_NO_CACHE * FROM TABLE

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

wbharding
источник
1
Но если ваш кеш заполнен другими, у вас появится иллюзия скорости. Но иногда нет.
каратэдог
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;
newtover
источник
3
«Я нашел, что это гораздо лучший показатель, чем при использовании SQL_NO_CACHE». Как так? Похоже, вам понадобится довольно веский аргумент для использования скрытого хака по явному ключевому слову, если только явное ключевое слово не выполняет то, что заявлено.
Air
1
@Air Я нашел, что это решение работает лучше, чем SQL_NO_CACHE. SQL_NO_CACHE впервые работал при выполнении запроса, но затем снова не работал. Я предполагаю, что это связано с другими механизмами кэширования. Я думаю, что это работает лучше, потому что поиск, основанный на переменной, не может быть кэширован ни одним слоем или механизмом - по крайней мере, это мое лучшее предположение.
Клик
2

Если вы хотите отключить кэш запросов, установите для параметра «query_cache_size» значение 0 в вашем файле конфигурации mysql. Если установлено 0, mysql не будет использовать кеш запросов.

Jinesh
источник