8.12.4.1 Как MySQL использует память
MySQL выделяет буферы и кэши для повышения производительности операций с базой данных. Значения по умолчанию позволяют серверу MySQL запускаться на виртуальной машине с примерно 512 МБ оперативной памяти. Можно улучшить производительность MySQL, увеличив значения определенных системных переменных, связанных с кэшем и буферами. Также можно изменить конфигурацию по умолчанию, чтобы запустить MySQL на системах с ограниченным объёмом памяти.
В следующем списке описаны некоторые способы использования памяти MySQL. Применимо, упоминаются соответствующие системные переменные. Некоторые пункты зависят от хранилища данных или конкретной функции.
-
Пул буферов
InnoDB— это область памяти, содержащая кэшированныеInnoDBданные для таблиц, индексов и других вспомогательных буферов. Для повышения эффективности операций чтения больших объемов данных, пул буферов разделен на страницы, которые могут потенциально содержать несколько строк. Для повышения эффективности управления кэшем, пул буферов реализован как связанный список страниц; данные, которые редко используются, удаляются из кэша, используя вариант алгоритмаInnoDB. Для получения дополнительной информации, см. Раздел 14.5.1, «Buffer Pool».Размер пула буферов важен для производительности системы:
Система
malloc()выделяет память для всего пула буферов при запуске сервера, используя операцииinnodb_buffer_pool_size. Переменная системыinnodb_buffer_pool_sizeопределяет размер пула буферов. Обычно рекомендуется значениеinnodb_buffer_pool_size— 50–75 процентов от оперативной памяти.innodb_buffer_pool_instancesможно настроить динамически во время работы сервера. Для получения дополнительной информации, см. Раздел 14.8.3.1, «Настройка размера пула буферов InnoDB».На системах с большим объемом оперативной памяти можно улучшить конкурентность, разделив пул буферов на несколько страниц. Переменная системы
MyISAMопределяет количество экземпляров пула буферов.Слишком маленький пул буферов может привести к избыточным операциям сброса страниц из пула буферов, которые затем снова требуются через короткий промежуток времени.
Слишком большой пул буферов может вызвать использование свопинга из-за конкуренции за память.
-
Все потоки разделяют буфер ключей
key_buffer_size. Его размер определяется переменной системыMyISAM.Для каждой открываемой сервером
3 *таблицы файл индекса открывается один раз; файл данных открывается один раз для каждого одновременно работающего потока, который обращается к таблице. Для каждого потока выделяется структура таблицы, структуры столбцов для каждого столбца и буфер размеромNN(гдеN— максимальная длина строки, не считая столбцовBLOB). Столбец типаBLOBтребует от пяти до восьми байтов плюс длину данныхBLOB. СтойежMyISAMподдерживает один дополнительный буфер строки для внутренних целей. Переменная системы
myisam_use_mmapможет быть установлена в 1, чтобы включить кэширование в памяти для всехMyISAMтаблиц.-
Если внутренняя временная таблица в памяти становится слишком большой (определяется с помощью переменных системы
tmp_table_sizeиmax_heap_table_size), MySQL автоматически преобразует таблицу из памяти в формат на диске. Временные таблицы на диске используют движок хранения, определенный переменной системыinternal_tmp_disk_storage_engine. Вы можете увеличить допустимый размер временной таблицы, как описано в Разделе 8.4.4, «Использование внутренних временных таблиц в MySQL».Для таблиц
MEMORY, явно созданных с помощьюCREATE TABLE, только переменная системыmax_heap_table_sizeопределяет, насколько большой может стать таблица, и преобразование в формат на диске не происходит. Схема производительности MySQL — это функция для мониторинга выполнения сервера MySQL на низком уровне. Схема производительности динамически выделяет память постепенно, масштабируя использование памяти до фактической нагрузки сервера, вместо выделения требуемой памяти при запуске сервера. После выделения память не освобождается до перезапуска сервера. Для получения дополнительной информации, см. Раздел 25.17, «Модель распределения памяти схемы производительности».
-
Каждый поток, используемый сервером для управления подключениями клиентов, требует некоторого пространства, специфичного для потока. Следующий список указывает эти пространства и переменные системы, которые контролируют их размер:
Стек (
thread_stack)Буфер подключения (
net_buffer_length)Буфер результата (
net_buffer_length)
Буфер подключения и буфер результата изначально имеют размер, равный
net_buffer_lengthбайт, но динамически увеличиваются доmax_allowed_packetбайт по мере необходимости. Буфер результата уменьшается доnet_buffer_lengthбайт после каждой SQL-команды. Во время выполнения команды также выделяется копия текущей строки команды.Каждый поток подключения использует память для вычисления дайджестов команд. Сервер выделяет
max_digest_lengthбайт на сеанс. См. Раздел 25.10, «Дайджесты заявок схемы производительности». Все потоки разделяют общую базу памяти.
Когда поток больше не нужен, выделенная ему память освобождается и возвращается системе, если поток не возвращается в кэш потоков. В этом случае память остается выделенной.
Каждый запрос, который выполняет последовательный поиск по таблице, выделяет буфер чтения. Переменная системы
read_buffer_sizeопределяет размер буфера.При чтении строк в произвольном порядке (например, после сортировки) может быть выделен буфер произвольного чтения для избежания обращений к диску. Переменная системы
read_rnd_buffer_sizeопределяет размер буфера.Все соединения выполняются в одном проходе, и большинство соединений могут быть выполнены без использования временной таблицы. Большинство временных таблиц — это таблицы хэширования в памяти. Временные таблицы с большой длиной строк (вычисляется как сумма длин всех столбцов) или содержащие столбцы
BLOBхранятся на диске.Большинство запросов, которые выполняют сортировку, выделяют буфер сортировки и от 0 до двух временных файлов в зависимости от размера набора результатов. См. Раздел B.3.3.5, «Где MySQL хранит временные файлы».
Почти все операции парсинга и вычислений выполняются в локальных и многократно используемых пулах памяти. Для небольших элементов не требуется избыточной памяти, что позволяет избежать обычных медленных операций выделения и освобождения памяти. Память выделяется только для неожиданно больших строк.
Для каждой таблицы, имеющей столбцы
BLOB, буфер динамически увеличивается, чтобы прочитать более крупные значенияBLOB. Если вы выполняете поиск по таблице, буфер увеличивается до размера наибольшего значенияBLOB.-
MySQL требует памяти и дескрипторов для кэша таблиц. Структуры обработчиков для всех используемых таблиц сохраняются в кэше таблиц и управляются как «Первым вошел, первым вышел» (FIFO). Переменная системы
table_open_cacheопределяет начальный размер кэша таблиц; см. Раздел 8.4.3.1, «Как MySQL открывает и закрывает таблицы».MySQL также требует памяти для кэша определения таблиц. Переменная системы
table_definition_cacheопределяет количество определений таблиц (из файлов.frm), которые могут храниться в кэше определения таблиц. Если вы используете большое количество таблиц, вы можете создать большой кэш определения таблиц, чтобы ускорить открытие таблиц. Кэш определения таблиц занимает меньше места и не использует дескрипторы файлов, в отличие от кэша таблиц. Команда
FLUSH TABLESили команда mysqladmin flush-tables закрывает все неиспользуемые таблицы сразу и помечает все используемые таблицы на закрытие при завершении выполнения текущего потока. Это эффективно освобождает большую часть используемой памяти.FLUSH TABLESне возвращает результат, пока все таблицы не будут закрыты.
Сервер кэширует информацию в памяти в результате выполнения команд
GRANT,CREATE USER,CREATE SERVERиINSTALL PLUGIN. Эта память не освобождается соответствующими командамиREVOKE,DROP USER,DROP SERVERиUNINSTALL PLUGIN, поэтому для сервера, выполняющего много таких команд, которые вызывают кэширование, использование кэшированной памяти, скорее всего, будет увеличиваться, если её не освободить с помощью командыFLUSH PRIVILEGES.
ps и другие программы статуса системы могут показывать, что mysqld использует много памяти. Это может быть вызвано стеками потоков по разным адресам памяти. Например, Solaris версия ps считает неиспользуемую память между стеками, как используемую. Для проверки этого, проверьте доступный своп с помощью swap -s. Мы тестируем mysqld с несколькими детекторами утечек памяти (как коммерческими, так и с открытым исходным кодом), поэтому утечек памяти быть не должно.
© 2025 Oracle
Licensed under the GPLv2 License.