10.12.3.1 Как MySQL использует память
MySQL выделяет буферы и кэши для повышения производительности операций с базой данных. Значения по умолчанию конфигурации рассчитаны на запуск сервера MySQL на виртуальной машине с примерно 512 МБ оперативной памяти. Вы можете улучшить производительность MySQL, увеличив значения некоторых системных переменных, связанных с кэшем и буферами. Вы также можете изменить конфигурацию по умолчанию, чтобы запустить MySQL на системах с ограниченным объёмом памяти.
В следующем списке описаны некоторые способы использования памяти MySQL. Применимо, ссылки на соответствующие системные переменные. Некоторые пункты специфичны для движка хранения или функции.
-
Кэш-пул буферов
InnoDB— это область памяти, которая хранит кэшированныеInnoDBданные для таблиц, индексов и других вспомогательных буферов. Для повышения эффективности операций чтения с высокой загрузкой, кэш-пул буферов разделён на страницы, которые могут потенциально хранить несколько строк. Для повышения эффективности управления кэшем, кэш-пул реализован как связанный список страниц; данные, которые редко используются, вытесняются из кэша с помощью модификации алгоритма . Для получения дополнительной информации, см. Раздел 17.5.1, «Buffer Pool».Размер кэш-пула буферов важен для производительности системы:
InnoDBвыделяет память для всего кэш-пула буферов при запуске сервера, используяmalloc()операции. Переменная системыinnodb_buffer_pool_sizeопределяет размер кэш-пула. Обычно рекомендуемоеinnodb_buffer_pool_sizeзначение составляет от 50 до 75 процентов оперативной памяти.innodb_buffer_pool_sizeможет быть настроено динамически во время работы сервера. Для получения дополнительной информации, см. Раздел 17.8.3.1, «Настройка размера кэш-пула буферов InnoDB».На системах с большим объёмом памяти можно повысить конкурентность, разделив кэш-пул на несколько . Переменная системы
innodb_buffer_pool_instancesопределяет количество экземпляров кэш-пула.Кэш-пул, который слишком мал, может вызвать чрезмерную переработку, поскольку страницы удаляются из кэш-пула только для того, чтобы снова потребоваться вскоре после этого.
Кэш-пул, который слишком велик, может вызвать подкачку из-за конкуренции за память.
Интерфейс хранилища позволяет оптимизатору предоставлять информацию о размере буфера записи, который будет использоваться для сканирования, которые оптимизатор оценивает как вероятные для чтения нескольких строк. Размер буфера может варьироваться в зависимости от размера оценки.
InnoDBиспользует эту возможность переменного буферирования, чтобы воспользоваться преимуществом предварительной выборки строк и уменьшить накладные расходы на блокировку и навигацию по B-дереву.-
Все потоки используют общий буфер ключей
MyISAM. Размер буфера определяется переменной системыkey_buffer_size.Для каждой
MyISAMтаблицы, открываемой сервером, файл индекса открывается один раз; файл данных открывается один раз для каждого одновременно выполняемого потока, который обращается к таблице. Для каждого одновременно работающего потока выделяется структура таблицы, структуры столбцов для каждого столбца и буфер размером3 *(гдеNN— максимальная длина строки, не считаяBLOBстолбцов).BLOBстолбец требует от пяти до восьми байт плюс длину данныхBLOB.MyISAMхранилище поддерживает один дополнительный буфер строки для внутреннего использования. Переменная системы
myisam_use_mmapможет быть установлена в 1 для включения кэширования в памяти для всехMyISAMтаблиц.-
Если внутренняя временная таблица в памяти становится слишком большой (как определяется
tmp_table_sizeиmax_heap_table_size), MySQL автоматически преобразует таблицу из памяти в формат на диске, который используетInnoDBхранилище. Вы можете увеличить допустимый размер временной таблицы, как описано в Разделе 10.4.4, «Использование внутренних временных таблиц в MySQL».Для
MEMORYтаблиц, явно созданных с помощьюCREATE TABLE, только переменная системыmax_heap_table_sizeопределяет, насколько большая может стать таблица, и преобразования в формат на диске не происходит. MySQL Performance Schema — это функция для мониторинга выполнения сервера MySQL на низком уровне. Performance Schema динамически выделяет память по частям, масштабируя использование памяти в соответствии с фактической нагрузкой сервера, вместо выделения необходимой памяти во время запуска сервера. После выделения памяти она не освобождается до перезапуска сервера. Для получения дополнительной информации, см. Раздел 29.17, «Модель выделения памяти Performance Schema».
-
Каждый поток, используемый сервером для управления подключениями клиентов, требует определенного пространства, специфичного для потока. Следующий список показывает эти потоки и переменные системы, которые управляют их размером:
Стек (
thread_stack)Буфер подключения (
net_buffer_length)Буфер результатов (
net_buffer_length)
Буфер подключения и буфер результатов начинаются с размера, равного
net_buffer_lengthбайтам, но динамически увеличиваются доmax_allowed_packetбайт по мере необходимости. Буфер результатов уменьшается доnet_buffer_lengthбайт после каждой SQL-команды. Во время выполнения команды также выделяется копия текущей строки команды.Каждый поток подключения использует память для вычисления хэшей запросов. Сервер выделяет
max_digest_lengthбайт на сеанс. См. Раздел 29.10, «Performance Schema Statement Digests и выборка». Все потоки используют общую базу памяти.
Когда поток больше не нужен, выделенная ему память освобождается и возвращается системе, если поток не возвращается в кэш потоков. В этом случае память остаётся выделенной.
Каждый запрос, который выполняет последовательное сканирование таблицы, выделяет буфер чтения. Переменная системы
read_buffer_sizeопределяет размер буфера.При чтении строк в произвольном порядке (например, после сортировки) может быть выделен буфер произвольного чтения, чтобы избежать поиска на диске. Переменная системы
read_rnd_buffer_sizeопределяет размер буфера.Все соединения выполняются в одном проходе, и большинство соединений могут быть выполнены без использования временных таблиц. Большинство временных таблиц являются основанными на хэше таблицами в памяти. Временные таблицы с большой длиной строки (вычисляется как сумма длин всех столбцов) или которые содержат
BLOBстолбцы, хранятся на диске.Большинство запросов, которые выполняют сортировку, выделяют буфер сортировки и от нуля до двух временных файлов в зависимости от размера набора результатов. См. Раздел B.3.3.5, «Где MySQL хранит временные файлы».
Практически все операции парсинга и вычисления выполняются в локальных для потока и многократно используемых пулах памяти. Накладные расходы на память не требуются для небольших элементов, тем самым избегая обычной медленной выделения и освобождения памяти. Память выделяется только для неожиданно больших строк.
Для каждой таблицы, имеющей
BLOBстолбцы, буфер динамически увеличивается для чтения больших значенийBLOB. Если вы сканируете таблицу, буфер увеличивается до размера самого большого значенияBLOB.-
MySQL требует памяти и дескрипторов для кэша таблиц. Структуры обработчика для всех используемых таблиц сохраняются в кэше таблиц и управляются как “Первым вошел, первым вышел” (FIFO). Переменная системы
table_open_cacheопределяет начальный размер кэша таблиц; см. Раздел 10.4.3.1, «Как MySQL открывает и закрывает таблицы».MySQL также требует памяти для кэша определения таблиц. Переменная системы
table_definition_cacheопределяет количество определений таблиц, которые могут быть сохранены в кэше определения таблиц. Если вы используете большое количество таблиц, вы можете создать большой кэш определений таблиц для ускорения открытия таблиц. Кэш определений таблиц занимает меньше места и не использует дескрипторы файлов, в отличие от кэша таблиц.
Выполнение инструкции
FLUSH TABLESили команды mysqladmin flush-tables закрывает все неиспользуемые таблицы сразу и помечает все используемые таблицы для закрытия по завершении текущей выполняемой нити. Это эффективно освобождает большую часть используемой памяти.FLUSH TABLESне возвращается, пока все таблицы не будут закрыты.Сервер кэширует информацию в памяти в результате выполнения инструкций
GRANT,CREATE USER,CREATE SERVERиINSTALL PLUGIN. Эта память не освобождается соответствующими инструкциямиREVOKE,DROP USER,DROP SERVERиUNINSTALL PLUGIN, поэтому для сервера, выполняющего много экземпляров инструкций, вызывающих кэширование, наблюдается увеличение использования кэшированной памяти, если она не освобождается с помощьюFLUSH PRIVILEGES.-
В топологии репликации следующие настройки влияют на использование памяти и могут быть скорректированы по мере необходимости:
Система переменная
max_allowed_packetна источнике репликации ограничивает максимальный размер сообщения, который источник отправляет своим репликам для обработки. По умолчанию это значение равно 64 МБ.Переменная системы
replica_pending_jobs_size_maxна многопоточной реплике задаёт максимальный объём памяти, выделяемый для хранения сообщений, ожидающих обработки. По умолчанию это значение равно 128 МБ. Память выделяется только при необходимости, но она может использоваться, если ваша топология репликации иногда обрабатывает большие транзакции. Это мягкое ограничение, и более крупные транзакции могут быть обработаны.Переменная системы
rpl_read_sizeна источнике или реплике репликации управляет минимальным объёмом данных в байтах, считываемом из файлов журнала бинарных логов и файлов журнала ретрансляции. Значение по умолчанию составляет 8192 байта. Буфер размером, равным этому значению, выделяется для каждой нити, которая считывает данные из файлов журнала бинарных логов и файлов журнала ретрансляции, включая нити дампов на источнике и нити координаторов на репликах.Переменная системы
binlog_transaction_dependency_history_sizeограничивает количество хэшей строк, хранящихся в кэше истории.Переменная системы
max_binlog_cache_sizeопределяет верхний предел использования памяти отдельной транзакцией.Переменная системы
max_binlog_stmt_cache_sizeопределяет верхний предел использования памяти кэшем инструкций.
Программы ps и другие программы отображения статуса системы могут сообщать, что mysqld использует много памяти. Это может быть вызвано стеками потоков по разным адресам памяти. Например, Solaris-версия ps считает неиспользуемую память между стеками как используемую память. Для проверки этого проверьте доступный своп с помощью swap -s. Мы тестируем mysqld с несколькими детекторами утечек памяти (как коммерческими, так и с открытым исходным кодом), поэтому утечек памяти быть не должно.
© 2025 Oracle
Licensed under the GPLv2 License.