Spec-Zone.ru › MySQL 5.7

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 * N таблицы файл индекса открывается один раз; файл данных открывается один раз для каждого одновременно работающего потока, который обращается к таблице. Для каждого потока выделяется структура таблицы, структуры столбцов для каждого столбца и буфер размером N (где 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/memory-use.html

Spec-Zone.ru

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