8.10.2.2 Кэши ключей
Общий доступ к кэшу ключей улучшает производительность, но не устраняет полностью конфликт между сессиями. Они по-прежнему конкурируют за управляющие структуры, которые управляют доступом к буферам кэша ключей. Для дальнейшего снижения конфликта при доступе к кэшу ключей MySQL также предоставляет несколько кэшей ключей. Эта функция позволяет назначать различные индексы таблиц различным кэшам ключей.
Если используется несколько кэшей ключей, сервер должен знать, какой кэш использовать при обработке запросов для данной MyISAM таблицы. По умолчанию все MyISAM индексы таблиц кэшируются в стандартном кэше ключей. Чтобы назначить индексы таблиц определённому кэшу ключей, используйте оператор CACHE INDEX (см. Раздел 13.7.6.2, «Оператор CACHE INDEX»). Например, следующее утверждение назначает индексы из таблиц t1, t2 и t3 к кэшу ключей с именем hot_cache:
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status | OK |
| test.t2 | assign_to_keycache | status | OK |
| test.t3 | assign_to_keycache | status | OK |
+---------+--------------------+----------+----------+
Кэш ключей, упомянутый в операторе CACHE
INDEX, может быть создан путём установки его размера с помощью параметра SET
GLOBAL или при помощи параметров запуска сервера. Например:
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
Чтобы уничтожить кэш ключей, установите его размер в ноль:
mysql> SET GLOBAL keycache1.key_buffer_size=0;
Вы не можете уничтожить стандартный кэш ключей. Любая попытка сделать это игнорируется:
mysql> SET GLOBAL key_buffer_size = 0;
mysql> SHOW VARIABLES LIKE 'key_buffer_size';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8384512 |
+-----------------+---------+
Переменные кэша ключей представляют собой системные переменные, имеющие имя и компоненты. Для keycache1.key_buffer_size, keycache1 является именем переменной кэша, а key_buffer_size — компонентом кэша. См. Раздел 5.1.8.3, «Структурированные системные переменные» для описания синтаксиса, используемого для обращения к структурированным системным переменным кэша ключей.
По умолчанию индексы таблиц назначаются главному (по умолчанию) кэшу ключей, созданному при запуске сервера. При уничтожении кэша ключей все индексы, назначенные ему, повторно назначаются стандартному кэшу ключей.
Для загруженного сервера можно использовать стратегию, включающую три кэша ключей:
«Горячий» кэш ключей, занимающий 20% от выделенного пространства для всех кэшей ключей. Используйте его для таблиц, которые интенсивно используются для поиска, но не обновляются.
«Холодный» кэш ключей, занимающий 20% от выделенного пространства для всех кэшей ключей. Используйте этот кэш для средних по размеру, интенсивно модифицируемых таблиц, таких как временные таблицы.
«Теплый» кэш ключей, занимающий 60% пространства кэша ключей. Используйте его в качестве стандартного кэша ключей, используемого по умолчанию для всех остальных таблиц.
Одна из причин, по которым использование трёх кэшей ключей выгодно, заключается в том, что доступ к одной структуре кэша ключей не блокирует доступ к другим. Операторы, которые обращаются к таблицам, назначенным одному кэшу, не конкурируют с операторами, которые обращаются к таблицам, назначенным другому кэшу. Прирост производительности происходит и по другим причинам:
Горячий кэш используется только для запросов получения данных, поэтому его содержимое никогда не изменяется. Следовательно, когда блок индекса нужно загрузить с диска, содержимое блока кэша, выбранного для замещения, не нужно сначала сбрасывать.
Для индекса, назначенного горячему кэшу, если нет запросов, требующих сканирования индекса, есть большая вероятность, что блоки индекса, соответствующие нелистовым узлам индексного B-дерева, останутся в кэше.
Операция обновления, чаще всего выполняемая для временных таблиц, выполняется значительно быстрее, когда обновлённый узел находится в кэше и не нужно сначала читать его с диска. Если размер индексов временных таблиц сопоставим с размером холодного кэша ключей, вероятность того, что обновлённый узел находится в кэше, очень высока.
Оператор CACHE INDEX устанавливает связь между таблицей и кэшем ключей, но эта связь теряется при каждом перезапуске сервера. Если вы хотите, чтобы связь действовала при каждом запуске сервера, один из способов достижения этого — использование файла настроек: Включите настройки переменных, которые конфигурируют ваши кэши ключей, и системную переменную init_file, которая указывает на файл, содержащий операторы CACHE
INDEX, которые необходимо выполнить. Например:
key_buffer_size = 4G
hot_cache.key_buffer_size = 2G
cold_cache.key_buffer_size = 2G
init_file=/path/to/data-directory/mysqld_init.sql
Операторы в mysqld_init.sql выполняются при каждом запуске сервера. Файл должен содержать по одному оператору SQL в строке. Следующий пример назначает несколько таблиц кэшам hot_cache и cold_cache:
CACHE INDEX db1.t1, db1.t2, db2.t3 IN hot_cache
CACHE INDEX db1.t4, db2.t5, db2.t6 IN cold_cache
© 2025 Oracle
Licensed under the GPLv2 License.