Silversy
@Silversy

MySQL кеширует запросы даже при выключенном кешировании?

Есть монстроидальный запрос. В первый раз он отрабатывает довольно долго (порядка 20-30 секунд). В последующие разы время его выполнения значительно сокращается (до 1-2 секунд).
Логично предположить, что это кеш, но даже при использовании MYSQL_NO_CACHE и при установке query_cache_type в OFF все повторяется.

Что это может быть и как от этого избавиться?

(Отключить кеш необходимо для того, чтобы видеть результаты оптимизации)
  • Вопрос задан
  • 4376 просмотров
Пригласить эксперта
Ответы на вопрос 5
Shedal
@Shedal
Это совсем не обязательно кэш.

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

Во-вторых, MySQL также на время кэширует план выполнения запроса.

как от этого избавиться?
Я не думаю, что от этого стоит (или даже можно) избавляться. Вреда никакого, одна сплошная польза :)
Ответ написан
Комментировать
NeX
@NeX
sql no cache зарещает только кэширование запросов. Для MyISAM еще, как правило, есть файловый кэш, параметр key_buffer_size. Для InnoDB — innodb_buffer_pool_size
Ответ написан
Комментировать
@egorinsk
Если бы результат брался из кеша, он бы не выполнялся 1-2 секнуды, а 1-100 мс. Скорее всего, просто куски файлов с диска попадают в кеш ОС и при повторном запросе берутся из памяти.

Если вы работаете под Линукс, кеш ОС (для чистоты эксперимента) можно сбросить записью единички куда-то в /proc (гуглите), внутренние буфера mysql сбрасываются перезапуском демона.

Т.е. делаете service mysql stop, сбрасываете кеш ОС, service mysql start и выполняете запрос.
Ответ написан
Комментировать
@odmin4eg
я когда-то задвался таким вопросом, и вроде как нашёл ответ, что встроенный кэш не выключается
Ответ написан
@mitnlag
Без оптимизации монстроидальный запрос монстроидально работает даже с кешем. Если с кешем все в порядке — значит, с запросом тоже ок.

MySQL не кеширует sub-queries. Можете попробовать вложить свой запрос внутрь обычного select и замерять время.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы