Spec-Zone.ru › MySQL 9.2

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 * N (где N — максимальная длина строки, не считая 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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/memory-use.html

Spec-Zone.ru

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