5.5.3 Как компиляция и линкование влияет на скорость MySQL | Оглавление | 5.5.5 Как MySQL использует DNS |
В следующем перечне дано описание некоторых аспектов использования памяти
сервером mysqld
. Там, где это возможно, приводятся имена серверных
переменных, относящихся к использованию памяти:
key_buffer_size
) используется совместно всеми
потоками; другие буферы, используемые данным сервером, выделяются при
необходимости (see section 5.5.2 Настройка параметров сервера).
thread_stack
),
буфер соединения (переменная net_buffer_length
) и буфер результата
(переменная net_buffer_length
). Буфер соединения и буфер результата
при необходимости динамически расширяются вплоть до
max_allowed_packet
. При выполнении запроса также выделяется память для
копии строки данного текущего запроса.
ISAM/MyISAM
имеют распределенную память.
Это объясняется тем, что 4 Гб памяти (адресуемой в рамках 32-битной
разрядности) мало для достаточно больших таблиц. Когда системы с
64-разрядными адресным пространством получат более широкое
распространение, мы сможем добавить в сервер общую поддержку для
распределения памяти.
record_buffer
).
record_rnd_buffer
).
HEAP
). Временные таблицы с записями большой длины
(вычисляемой как сумма длин всех столбцов) или таблицы, содержащие
столбцы BLOB
, хранятся на диске. В версиях MySQL до 3.23.2 существует
проблема, заключающаяся в том, что если таблицы HEAP
в динамически
выделяемой области превышают размер tmp_table_size
, то возникает
ошибка The table tbl_name is full
. В более новых версиях эта проблема
при необходимости решается путем автоматического преобразования
хранящихся в оперативной памяти HEAP
-таблиц в таблицы MyISAM
,
расположенные на диске. Чтобы обойти эту проблему, можно увеличить
размер временных таблиц установкой опции tmp_table_size
в mysqld
или
установкой SQL-опции SQL_BIG_TABLES
в клиентской программе (see section 5.5.6 Синтаксис команды SET
).
В версии MySQL 3.20 максимальный размер временной таблицы
был равен record_buffer*16
, так что при использовании данной версии
необходимо увеличить значение record_buffer
. Можно также запустить
mysqld
с опцией --big-tables
- для того, чтобы всегда хранить
временные таблицы на диске. Однако это будет влиять на скорость многих
сложных запросов.
malloc()
и free()
).
BLOB
). Для столбца BLOB
используется от 5 до 8 байтов плюс длина данных BLOB
. Обработчики
таблиц ISAM/MyISAM
будут использовать один дополнительный буфер строки
для внутреннего представления.
BLOB
, буфер динамически
увеличивается при чтении больших величин BLOB
. При просмотре таблицы
выделяется буфер с размером, равным наибольшей величине BLOB
.
mysqladmin flush-tables
закрывает все неиспользуемые таблицы и
отмечает все используемые таблицы, которые необходимо закрыть после
окончания выполнения текущего потока. Такой алгоритм позволяет
эффективно освобождать большое количество используемой памяти.
Программа ps
и другие программы контроля состояния системы могут сообщать,
что mysqld
использует слишком много памяти. Это может быть вызвано
расположением стеков памяти потоков по различным адресам в памяти.
Например, версия программы ps для Solaris интерпретирует неиспользуемую
память между стеками как используемую. Это можно проверить путем
выполнения допустимой перестановки с помощью swap -s
. Мы тестировали
mysqld
при помощи коммерческих детекторов утечки памяти, так что никаких
потерь памяти быть не должно.
5.5.3 Как компиляция и линкование влияет на скорость MySQL | Оглавление | 5.5.5 Как MySQL использует DNS |