# Главная
# О библиотеке

# Выбор дистрибутива
преимущества Linux/UNIX | основные дистрибутивы | серверный Linux | BSD | LiveCDs | прочее

# Установка и удаление программ
общие вопросы | каталоги софта | специальные случаи

# Настройка и работа
установка, загрузчики | настройка Linux | консоль | файловые системы | процессы | шеллы, русификация, коммандеры | виртуальные машины, эмуляторы

# X Window и оконные менеджеры
настройка X Window | GNOME | KDE | IceWM и др.

# Работа с текстами
редакторы | офис | шрифты, кодировки и русификация | преобразования текстовых файлов | LaTeX, SGML и др. | словари

# Графика
GIMP | фото | обработка изображений | форматы графических файлов

# Сети, администрирование
общие вопросы | Dialup & PPP | брандмауэры | маршрутизация | работа в Windows-сетях | веб-серверы | Apache | прокси-серверы | сетевая печать | прочее

# Программирование
GCC & GNU make | программирование в UNIX | графические библиотеки | Tcl | Perl | PHP | Java & C# | СУБД | CVS | прочее

# Ядро
# Мультимедиа
# Интернет
# Почта
# Безопасность
# Железо
# Разное

# Linux HowTo (как сделать)
# Книги и руководства
# Материалы на английском языке


MySQL The World's Most Popular Open Source Database # Online shop | Site map |  
CompanyProductsSupport & ConsultingTraining & CertificationDownloadsDocumentation
  BooksArticlesMailing ListsPresentationsOther Sites  
Search the MySQL manual:
MySQL Manual
  • 6 Справочник по языку MySQL
    • 6.9 Кэш запросов в MySQL
      • 6.9.1 Как работает кэширование запросов
      • 6.9.2 Конфигурация кэша запросов
      • 6.9.3 Параметры кэша запросов в запросе SELECT
      • 6.9.4 Статус и поддержка кэша запросов

Buy this Reference Manual in softcover from Barnes & Noble!

MySQL Reference Manual
Previous / Next / Up / Table of Contents

6.9.1 Как работает кэширование запросов

Перед синтаксическим анализом запросы сравниваются, поэтому запросы

SELECT * FROM TABLE

и

Select * from table

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

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

Рассматриваемый кэш надежно работает для запросов вида SELECT CALC_ROWS ... и SELECT FOUND_ROWS() ..., так как число найденных строк всегда хранится в кэше.

При изменениях таблицы (INSERT, UPDATE, DELETE, TRUNCATE, ALTER или DROP TABLE|DATABASE), все кэшированные запросы, использовавшие данную таблицу (возможно, через таблицу MRG_MyISAM!), становятся недействительными и удаляются из кэша.

Если изменения были произведены в поддерживающих транзакции таблицах вида InnoDB, то все кэшированные запросы становятся недействительными при выполнении команды COMMIT.

Запрос не будет кэширован, если содержит одну из приведенных ниже функций:

Функция Функция Функция
Определяемые пользователем функции (UDF) CONNECTION_ID FOUND_ROWS
GET_LOCK RELEASE_LOCK LOAD_FILE
MASTER_POS_WAIT NOW SYSDATE
CURRENT_TIMESTAMP CURDATE CURRENT_DATE
CURTIME CURRENT_TIME DATABASE
ENCRYPT (с одним параметром) LAST_INSERT_ID RAND
UNIX_TIMESTAMP (без параметров) USER BENCHMARK

Запрос также не будет кэширован, если он содержит переменные пользователя или выражен в форме SELECT ... IN SHARE MODE или в форме SELECT * FROM AUTOINCREMENT_FIELD IS NULL (для полечения последнего ID - это для ODBC).

Однако FOUND ROWS() возвратит правильную величину, даже если из кэша был выбран предыдущий запрос.

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

Перед выборкой запроса из кэша запросов MySQL проверит, обладает ли пользователь привилегией SELECT для всех включенных баз данных и таблиц. Если это не так, то результат кэширования не используется.

User Comments

Posted by [name withheld] on Saturday January 25 2003, @10:26am[Delete] [Edit]

I wonder why the cache should be deleted if there's a statement like update, insert etc.
I think it must be considered that there are possible situations where this isn't the best way.
For example:

1) select * from DATABASE where DATE = '2002-12-02'
2) update DATABASE set NAME = 'my name' where DATE = '2002-12-01'

So 2) would kill the whole cache, but for 1) the update doesn't matter! Wouldn't it be better to look for what selects matters for the cache by updating something in the table???

I think that would improve much more performance.

Regards,
Reiner





Add your own comment.

Top / Previous / Next / Up / Table of Contents
# MySQL.com home | Site map | Contact us | Press | Jobs | Privacy policy | Trademark info | © 1995-2003 MySQL AB. All rights reserved.