SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.02.2014 03:08:50

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Кэширование запросов в MySQL

Несколько дополнений к статье Кэширование запросов в MySQL

1.

Ряд запросов не подлежит кэшированию:
    Запросы, использующие значения локальных переменных.
    Запросы, обращающиеся к базам данных mysql или INFORMATION_SCHEMA.

Точнее будет:
    Запросы, использующие значения пользовательских или локальных переменных.
    Запросы, обращающиеся к базам данных mysql, INFORMATION_SCHEMA или performance_schema.
    Начиная с версии MySQL 5.6.5, запросы, содержащие таблицы, разбитые на партиции.

2. Относительно параметра query_cache_wlock_invalidate стоит указать, что значение по умолчанию OFF приводит к тому, что из кэша читаются данные из MyISAM таблиц, которые заблокированы другим соединением.


Кстати,

http://dev.mysql.com/doc/refman/5.6/en/query-cache-operation.html написал:

In MySQL 5.6, the result from a SELECT query on a view is cached.

Неактивен

 

#2 04.02.2014 05:23:06

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Кэширование запросов в MySQL

Спасибо за комментарии, внес поправки в статью.

Про партиции точнее будет: начиная с MySQL версий 5.1.63, 5.5.23, 5.6.5.

Про VIEW добавил - это во всех версиях. Про query_cache_wlock_invalidate добавил blockquote

Неактивен

 

#3 04.02.2014 05:28:23

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Кэширование запросов в MySQL

query cache для paritioned таблиц - это они багу так пофиксили:
http://bugs.mysql.com/bug.php?id=53775

Неактивен

 

#4 04.02.2014 13:06:38

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Кэширование запросов в MySQL

После включения кэш работает автоматически:

    При каждом запросе типа SELECT вычисляет хэш-сумму строки запроса и ищет ее в кэше. Если находит - возвращает рузельтат из кэша, если нет - выполняет запрос, а результат заносит в кэш (если результат не больше значения query_cache_limit).
    При каждом запросе типа UPDATE, REPLACE, INSERT, DELETE, TRUNCATE или ALTER, удаляет из кэша все запросы, использующие таблицу, подвергшуюся обновлению.

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


Мерой эффективности кэша может служить отношение Qcache_hits / (Qcache_inserts + Qcache_not_cached).

Здесь стоит расширить:
а) какое значение можно считать достаточным?
б) с чем связано низкое значение? Можеть быть просто мало памяти выделено под кэш и запросы из него постоянно вытесняются.
в) данное отношение показывает неполную картину. Например, есть несколько часто обновляемых таблиц, по которым не идет выборка (логи). Тем не менее каждое изменение требует обращения к кэшу - нужно ли из него удалять запросы. Показатель эффективности кэша может быть отличным, а производительность упадет.

Неактивен

 

#5 10.02.2014 03:07:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Кэширование запросов в MySQL

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

Мне кажется, что начинающие с этим вряд ли столкнутся. Добавил blockquote, но не уверен, что посыл статьи станет понятнее. Те, кому нужна такая информация - не читатели базовой статьи про кэш.

>> Здесь стоит расширить:
>> а) какое значение можно считать достаточным?

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

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson