Spec-Zone .ru
спецификации, руководства, описания, API
|
Следующий список указывает на некоторые из способов, которыми mysqld сервер использует память. Где применимый, имя системной переменной, относящейся к использованию памяти, дается:
Все потоки совместно используют MyISAM
ключевой буфер; его размер определяется key_buffer_size
переменная. Другие буферы, используемые сервером,
выделяются как необходимый. См. Раздел 8.11.2, "Настраивая
Параметры Сервера".
Каждый поток, который используется, чтобы управлять клиентскими соединениями, использует некоторое специфичное для потока пространство. Следующий список указывает на них и какие переменные управляют своим размером:
Стек (переменная thread_stack
)
Буфер соединения (переменная net_buffer_length
)
Буфер результата (переменная net_buffer_length
)
Буфер соединения и результат буферизуют, каждый начинает с размера, равного net_buffer_length
байты, но динамически увеличиваются до max_allowed_packet
байты как необходимый. Буфер результата уменьшается к net_buffer_length
байты после каждого SQL-оператора. В то время
как оператор работает, копия текущей строки оператора также выделяется.
Все потоки совместно используют ту же самую основную память.
Когда поток больше не необходим, память, выделенная ему, выпускается и возвращается к системе, если поток не возвращается в кэш потока. В этом случае память остается выделенной.
myisam_use_mmap
системная переменная может быть установлена в 1 включить
отображению памяти для всех MyISAM
таблицы.
Каждый запрос, который выполняет последовательное сканирование таблицы, выделяет
буфер чтения (переменная read_buffer_size
).
Читая строки в произвольной последовательности (например, после вида), буфер случайного чтения (переменная read_rnd_buffer_size
) может быть выделен, чтобы избежать поиска на диске.
Все соединения выполняются в единственной передаче, и большинство соединений может
обойтись без даже использование временной таблицы. Наиболее временные таблицы являются основанными на
памяти хэш-таблицами. Временные таблицы с большой длиной строки (вычисленный как сумма всех длин
столбца) или которые содержат BLOB
столбцы сохранены на диске.
Если внутренняя временная таблица в памяти становится слишком большой, MySQL обрабатывает это
автоматически, изменяя таблицу от в памяти до дискового формата, чтобы быть обработанным MyISAM
механизм хранения. Можно увеличить допустимый размер временной
таблицы как описано в Разделе 8.4.3.3,
"Использование MySQL How Внутренние Временные таблицы".
Большинство запросов, которые выполняют вид, выделяет буфер вида и нуль к двум временным файлам в зависимости от размера набора результатов. См. Раздел C.5.4.4, "MySQL Where Хранит Временные Файлы".
Почти весь парсинг и вычисление делаются в локальных для потока и допускающих повторное использование пулах памяти. Никакие издержки памяти не необходимы для мелочей, таким образом, нормального медленного выделения памяти и освобождения избегают. Память выделяется только для неожиданно больших строк.
Для каждого MyISAM
таблица, которая открывается,
индексный файл, открывается однажды; файл данных открывается однажды для каждого одновременно рабочего
потока. Для каждого параллельного потока, структуры таблицы, структур столбца для каждого столбца, и
буфера размера 3 *
выделяются
(где N
N
максимальная длина строки, не рассчитывая BLOB
столбцы). A BLOB
столбец требует пяти - восьми байтов плюс длина BLOB
данные. MyISAM
механизм хранения
поддерживает один дополнительный буфер строк для внутреннего пользования.
Для каждого табличного наличия BLOB
столбцы, буфер увеличивается динамически, чтобы читать в большем BLOB
значения. Если Вы сканируете таблицу, буфер столь же большой как
самое большое BLOB
значение выделяется.
Структуры обработчика для всех таблиц в использовании сохраняются в кэше и
управляются как FIFO. Начальный размер кэша берется от значения table_open_cache
системная переменная. Если таблица использовалась
двумя рабочими потоками одновременно, кэш содержит две записи для таблицы. См. Раздел
8.4.3.1, "Как MySQL Opens и Closes Tables".
A FLUSH TABLES
оператор или mysqladmin команда таблиц сброса закрывают все таблицы, которые не
находятся в использовании сразу, и отмечает все таблицы в использовании, которые будут закрыты, когда в
настоящий момент выполняющийся поток заканчивается. Это эффективно освобождает наиболее память в
использовании. FLUSH TABLES
не возвращается, пока все таблицы не были закрыты.
Информация о кэшах сервера в памяти в результате GRANT
, CREATE
USER
, CREATE SERVER
,
и INSTALL PLUGIN
операторы. Эта память не выпускается соответствием REVOKE
, DROP
USER
, DROP SERVER
,
и UNINSTALL PLUGIN
операторы, таким образом, для сервера, который выполняет много экземпляров операторов, которые вызывают
кэширование, будет увеличение использования памяти. Эта кэшируемая память может быть освобождена с FLUSH
PRIVILEGES
.
постскриптум и другие системные программы состояния могут сообщить,
что mysqld использует много памяти. Это может быть вызвано
стеками потока на различных адресах памяти. Например, версия Соляриса постскриптума
считает неиспользованную память между стеками как используемая память. Чтобы проверить это, проверьте доступную
подкачку с swap -s
. Мы тестируем mysqld с несколькими детекторами утечки памяти (и
коммерческий и С открытым исходным кодом), таким образом не должно быть никаких утечек памяти.