10.10.2.2 Кэши ключей нескольких типов
Начиная с MySQL 9.2, синтаксис структурных переменных с составными частями, обсуждаемый здесь для ссылки на кэши ключей нескольких типов, устарел.
Общий доступ к кэшу ключей улучшает производительность, но не устраняет полностью конкуренцию между сеансами. Они по-прежнему конкурируют за управляющие структуры, которые управляют доступом к буферам кэша ключей. Для дальнейшего снижения конкуренции при доступе к кэшу ключей MySQL также предоставляет несколько кэшей ключей. Эта функция позволяет назначать различные индексы таблиц различным кэшам ключей.
При наличии нескольких кэшей ключей сервер должен знать, какой кэш использовать при обработке запросов для заданной таблицы. По умолчанию все индексы таблиц кэшируются в стандартном кэше ключей. Для назначения индексов таблиц конкретному кэшу ключей используйте оператор CACHE INDEX (см. Раздел 15.7.8.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 — компонент кэша. См. Раздел 7.1.9.5, «Структурированные системные переменные» для описания синтаксиса, используемого для ссылки на структурированные системные переменные кэша ключей.
По умолчанию индексы таблиц назначаются основному (стандартному) кэшу ключей, созданному при запуске сервера. Когда кэш ключей уничтожается, все индексы, назначенные ему, повторно назначаются стандартному кэшу ключей.
Для загруженного сервера можно использовать стратегию, включающую три кэша ключей:
«Горячий» кэш ключей, занимающий 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.