10.12.3.1 Как MySQL использует память
MySQL выделяет буферы и кэши для повышения производительности операций с базой данных. Значения по умолчанию конфигурации рассчитаны на запуск сервера MySQL на виртуальной машине с примерно 512 МБ оперативной памяти. Вы можете улучшить производительность MySQL, увеличив значения некоторых системных переменных, связанных с кэшем и буферами. Вы также можете изменить конфигурацию по умолчанию, чтобы запустить MySQL на системах с ограниченным объёмом памяти.
В следующем списке описаны некоторые способы использования памяти MySQL. Применимо, ссылки на соответствующие системные переменные. Некоторые пункты специфичны для движка хранения или функции.
-
Кэш-пул буфера
InnoDB— это область памяти, которая хранит данные кешированныхInnoDBтаблиц, индексов и других вспомогательных буферов. Для повышения эффективности операций чтения с высокой загрузкой, кэш-пул буфера разделён на страницы, которые могут потенциально хранить несколько строк. Для повышения эффективности управления кэшем, кэш-пул реализован как связанный список страниц; данные, которые используются редко, удаляются из кэша с использованием модификации алгоритма . Дополнительную информацию см. в разделе 17.5.1, «Buffer Pool».Размер кэш-пула буфера важен для производительности системы:
Сервер выделяет память для всего кэш-пула буфера при запуске, используя операции
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. Достижение этого предела также увеличиваетCount_hit_tmp_table_size. Вы можете увеличить допустимый размер временной таблицы, как описано в разделе 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 Дайджесты команд и выборки». Все потоки используют общую базу памяти.
Когда поток больше не нужен, выделенная ему память освобождается и возвращается системе, если поток не возвращается в кэш потоков. В этом случае память остаётся выделенной.
Каждый запрос, который выполняет последовательное сканирование таблицы, выделяет буфер чтения. Переменная системы
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 использует много памяти. Это может быть вызвано стеками потоков по разным адресам памяти. Например, версия ps для Solaris считает неиспользуемую память между стеками как используемую память. Для проверки этого проверьте доступный своп с помощью swap -s. Мы тестировали mysqld с несколькими детекторами утечек памяти (как коммерческими, так и с открытым исходным кодом), поэтому утечек памяти быть не должно.
© 2025 Oracle
Licensed under the GPLv2 License.