Spec-Zone.ru › MySQL 8.4

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 * N (где N — максимальная длина строки, не считая 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 определяет количество определений таблиц, которые могут быть сохранены в кэше определения таблиц. Если вы используете большое количество таблиц, вы можете создать большой кэш определений таблиц для ускорения открытия таблиц. Кэш определений таблиц занимает меньше места и не использует дескрипторы файлов, в отличие от кэша таблиц.

END_OF_DOCUMENT_MARKER ```
  • Выполнение инструкции 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.
https://docs.oracle.com/cd/E17952_01/mysql-8.4-en/memory-use.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API