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

266

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

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

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

Спасибо

Теги:

9 ответов

419

Попробуйте использовать параметр 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/...
Показать ещё 7 комментариев
87

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

SET SESSION query_cache_type=0;
  • 0
    Виноват. Это было query_cache_size я смотрел, не query_cache_type . Я перепутал ваш ответ с ответом SeniorDev.
  • 2
    +1 за отключение кеша на весь текущий сеанс!
35

Любая ссылка на текущую дату/время отключит кеш запросов для этого выбора:

SELECT *,NOW() FROM TABLE

См. "Предварительные требования и примечания для использования кеша запросов MySQL" @http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html

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

  • 1
    Этот ответ должен иметь больше голосов.
20

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

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

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

SELECT SQL_NO_CACHE * FROM TABLE

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

  • 0
    Это именно то, что он хочет. Для сравнения.
  • 1
    Но если ваш кеш будет заполнен другими, у вас появится иллюзия скорости. Но иногда нет.
8

Я бы использовал следующее:

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

Использование пользовательской переменной в запросе делает запрос результирующим необратимым. Я нашел его гораздо лучше, чем с помощью 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 не будет использовать кеш запросов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню