2015-12-16 5 views
5

Я знаю, что SQL-запрос будет использовать кеш запросов для получения данных вместо обработки всех данных. Вот вопрос, который я хотел бы спросить,SQL Query Cache

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

Если я очистить кэш запросов пример с использованием FLUSH QUERY CACHE; или RESET QUERY CACHE;,

Это повлияет на разработчиков других разработчиков или удалит только мой локальный кеш запросов?

Если это будет влиять на других, есть ли способ очистить локально или разрешить мой запросу не будет использовать кэш запросов для тестирования

+0

Я вернул SQL Server и добавил SQL, так как этот вопрос теперь связан не только с MySQL. –

ответ

2

Два уточнениями начать с:

  • кэш MySQL запросов является функция на стороне сервера, нет такого понятия, как «локальный кэш». Вероятно, вас смущает ключевое слово LOCAL в команде FLUSH. Как docs объясните, что это просто псевдоним для NO_WRITE_TO_BINLOG (таким образом, он связан с репликацией, а «local» означает «этот сервер»).

  • MySQL будет возвращать только кешированные данные, если вы включили эту функцию и либо сделали ее по умолчанию, либо выбрали с помощью подсказки SQL_CACHE. По моему опыту, большинство серверов не имеют его по умолчанию.

Теперь давайте ответим на ваш вопрос. В The MySQL Query Cache мы можем прочитать:

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

Что имеет смысл: кэш, который не может повторно использовать сохраненные данные, не так полезен.

Я не знаю, что вы хотите точно проверить. Ваши данные всегда должны быть свежими:

Кэш запросов не возвращает устаревшие данные. Когда таблицы изменены, все соответствующие записи в кеше запроса очищаются.

Однако вы можете захотеть узнать, как долго выполняется запрос. Вы всегда можете отказаться от the SQL_NO_CACHE keyword:

Сервер не использует кеш запросов. Он не проверяет кеш запроса , чтобы узнать, уже ли кэширован результат, и не кэширует результат запроса.

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

1

Попробуйте использовать опцию SQL_NO_CACHE в вашем query.This остановит MySQL кэширования результатов

SELECT SQL_NO_CACHE * FROM TABLE 
+1

Работает ли это только с SELECT *? потому что, когда я использую его как SELECT SQL_NO_CACHE [значение] FROM TABLE, он указал недопустимое имя столбца для SQL_NO_CACHE – Dean

+0

подробнее http://dev.mysql.com/doc/refman/5.7/en/query-cache-in-select. html @Dean –

+1

@Dean Это расширение MySQL; синтаксис не будет работать в других СУБД. –

1

с SQL Server для кэшированных данных, вы можете использовать DBCC DROPCLEANBUFFERS и заставить манул CHECKPOINT.

Однако он работает на уровне сервера (пример):

Использование DBCC DROPCLEANBUFFERS для проверки запросов с кэшем холодного буфера без выключения и перезагрузки сервера.

Чтобы удалить чистые буферы из пула буферов, сначала используйте CHECKPOINT для создания холодного кеша буфера. Это заставляет все грязные страницы для текущей базы данных записываться на диск и очищает буферы. После этого вы можете выполнить команду DBCC DROPCLEANBUFFERS, чтобы удалить все буферы из пула буферов.

отредактировал *

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

+0

Итак ... «DBCC DROPCLEANBUFFERS» очищает буферный кеш для всего сервера? .. и есть ли способ очистить его локально, но не весь сервер? – Dean

+0

CHECKPOINT записывает все из памяти на диск, а затем DROPCLEANBUFFERS очищает буфер (поскольку все записано). Но это для SQL Server (прежде чем вы упомянули, что это MySQL). Он очищает весь кеш на сервере. Кэш является глобальным для экземпляра SQL Server, для всех и не связан с конкретным пользователем. –

+0

ОК .. спасибо .. Это может быть так же, как MySQL, который хранится в глобальном масштабе. не совсем уверен. сделаю еще несколько исследований, если да, я помечаю его как решение для MySQL и SQL Server. – Dean