10.10.2 Кэш ключей MyISAM
Для минимизации ввода-вывода с диска хранилище MyISAM использует стратегию, используемую во многих системах управления базами данных. Оно использует механизм кэширования для хранения наиболее часто используемых блоков таблиц в памяти:
Для блоков индексов поддерживается специальная структура, называемая кэшем ключей (или буфером ключей). Структура содержит несколько буферов блоков, в которые помещаются наиболее часто используемые блоки индексов.
Для блоков данных MySQL не использует специального кэша. Вместо этого он полагается на кэш файловой системы операционной системы.
В этом разделе сначала описывается основная работа кэша ключей MyISAM. Затем рассматриваются функции, которые улучшают производительность кэша ключей и позволяют лучше контролировать работу кэша:
Несколько сеансов могут одновременно обращаться к кэшу.
Вы можете настроить несколько кэшей ключей и назначить индексы таблиц определенным кэшам.
Для управления размером кэша ключей используйте системную переменную key_buffer_size. Если эта переменная установлена в ноль, кэш ключей не используется. Кэш ключей также не используется, если значение key_buffer_size слишком мало для выделения минимального количества буферов блоков (8).
Когда кэш ключей не работает, файлы индексов используются только с помощью кэширования файловой системы, предоставляемого операционной системой. (Другими словами, блоки индексов таблиц используются по той же стратегии, что и блоки данных таблиц.)
Блок индекса — это непрерывная единица доступа к файлам индекса MyISAM. Обычно размер блока индекса равен размеру узлов индексного дерева B. (Индексы представлены на диске с помощью структуры данных B-дерева. Узлы в нижней части дерева являются листовыми узлами. Узлы над листовыми узлами являются узлами, не являющимися листовыми.)
Все буферы блоков в структуре кэша ключей имеют одинаковый размер. Этот размер может быть равен, больше или меньше размера блока индекса таблицы. Обычно одно из этих двух значений является кратным другому.
Когда требуется доступ к данным из любого блока индекса таблицы, сервер сначала проверяет, доступен ли он в каком-либо буфере блока кэша ключей. Если он есть, сервер обращается к данным в кэше ключей, а не к диску. То есть он считывает или записывает в кэш, а не считывает или записывает с диска. В противном случае сервер выбирает буфер блока кэша, содержащий другой блок (или блоки) индекса таблицы, и заменяет данные там копией необходимого блока индекса таблицы. Как только новый блок индекса находится в кэше, к данным индекса можно получить доступ.
Если оказывается, что блок, выбранный для замены, был изменен, блок считается «грязным». В этом случае перед заменой его содержимое записывается в индекс таблицы, из которого он был получен.
Обычно сервер использует стратегию LRU (Least Recently Used): при выборе блока для замены он выбирает наименее недавно использованный блок индекса. Чтобы упростить этот выбор, модуль кэша ключей сохраняет все используемые блоки в специальном списке (цепочка LRU), упорядоченном по времени использования. Когда к блоку обращаются, он считается наиболее недавно используемым и помещается в конец списка. Когда блоки нужно заменить, блоки в начале списка являются наименее недавно использованными и становятся первыми кандидатами на удаление.
Хранилище InnoDB также использует алгоритм LRU для управления своим буфером пула. См. Раздел 17.5.1, «Буферный пул».
© 2025 Oracle
Licensed under the GPLv2 License.