10.10.2.2 Кэши ключей
Начиная с MySQL 8.4, синтаксис составных структурных переменных, описанный здесь для ссылок на несколько кэшей ключей, устарел.
Общий доступ к кэшу ключей повышает производительность, но не устраняет полностью конфликт между сессиями. Они по-прежнему конкурируют за управляющие структуры, которые управляют доступом к буферам кэша ключей. Для дальнейшего уменьшения конфликтов доступа к кэшу ключей 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.