Настройка клиентских буферов MySQL
Оглавление
В MySQL имеются буферы, распределяемые для каждого установленного клиентского подключения.
join_buffer_size
Буфер join используется для сканирования только индекса, диапазона индекса и при слияниях таблиц, использующих полное сканирование таблицы. Переменная настраивает минимальный размер буфера, который по умолчанию равен 256 килобайтам. Прежде чем увеличивать размер этого буфера, лучше подумать о добавлении индексов, которые могли бы ускорить слияние таблиц.
sort_buffer_size
Буфер sort используется для сортировок и группировок. Если данные не умещаются в этот буфер, то используется диск. Значения по умолчанию - 256 килобайт. Для Linux лучше всего подходят значения - 256 килобайт или 2 мегабайт, а большие значения могут привести к замедлению.
Вместо того, чтобы увеличивать размер этого буфера, лучше подумать об оптимизации запроса или о создании подходящих индексов.
Для подбора оптимального значения можно ориентироваться на значение переменной Sort_merge_passes, которая считает количество проходов сортировки слиянием с момента запуска сервера MySQL. Получить значение переменной можно, например, с помощью следующего запроса:
SHOW GLOBAL STATUS WHERE Variable_name = 'Sort_merge_passes';
read_buffer_size
Буфер read используется для последовательного чтения строк из таблиц MyISAM. По умолчанию настроено значение 128 килобайт, изменять можно с шагом в 4 килобайта. Оптимально значение по умолчанию в 128 килобайт.
read_rnd_buffer_size
Буфер read_rnd используется для чтения строк в произвольном порядке из таблиц MyISAM и при сортировке строк. По умолчанию имеет значение 256 килобайт. Если какой-то клиент выполняет запрос с сортировкой большой выборки, то лучше менять значение этой опции внутри клиентского подключения, а не на уровне сервера.
bulk_insert_buffer_size
Максимальный размер буфера, используемого для вставки данных в непустые таблицы MyISAM, для выполнения запросов INSERT ... SELECT
, INSERT ... VALUES
и LOAD DATA
. По умолчанию равен 8 мегабайтам. Для ускорения вставки данных в таблицы MyISAM размер этого буфера можно увеличить.
Временные файлы
При необходимости сортировки больших выборок данных MySQL использует раздел для временных файлов. Из-за этого выполнение больших запросов может происходить заметно дольше. Чтобы ускорить обработку таких запросов, можно создать файловую систему для временных файлов в оперативной памяти.
Создаём точку монтирования, например /mysql-tmp:
# cd /
# mkdir mysql-tmp
Добавляем в файл /etc/fstab строчку для монитрования раздела размером, например, 512 мегабайт:
tmpfs /mysql-tmp tmpfs relatime,nodev,nosuid,noexec,uid=mysql,gid=mysql,mode=0760,size=512M 0 0
Смонтируем временный раздел:
# mount /mysql-tmp
Теперь нужно указать в файле конфигурации сервера MySQL внутри секции server соответствующую опцию:
tmpdir = /mysql-tmp
И перезапустить MySQL:
# systemctl restart mysql
Стоит учитывать, что если места на этом разделе окажется недостаточно, запрос не выполнится и MySQL сообщит об ошибке выполнения запроса.
max_connections
Максимальное количество подключений к базе данных. Для обслуживания каждого подключения MySQL запускает по одному отдельному потоку. Если клиентов, подключающихся к базе данных, больше указанного числа, то подключения сверх лимита попадают в очередь, ожидая освобождения одного из занятых подключений.
В случае веб-приложений нет особого смысла выставлять эту настройку намного больше количества процессов сервера приложения. Если в php-fpm или uwsgi для работы приложения выделено 16 процессов, то как правило каждый процесс будет устанавливать не более одного подключения к базе данных.
max_connections = 140
Для настройки можно воспользоваться значением переменных Max_used_connections
и Threads_connected
, первая из которых фиксирует максимальное когда-либо использованное количество подключений, а вторая содержит текущее количество подключений. Если Max_used_connections
равно значению max_connections
, то бывали случаи, когда использовались все доступные подключения к серверу. Для более обоснованного решения об увеличении максимального количества подключений стоит понаблюдать за графиком Threads_connected
.
Для получения значений переменных Max_used_connections
и Threads_connected
можно воспользоваться, например, следующими запросами:
SHOW GLOBAL STATUS WHERE Variable_name = 'Max_used_connections';
SHOW GLOBAL STATUS WHERE Variable_name = 'Threads_connected';
max_user_connections
Максимальное количество подключений, которое может быть установлено одним и тем же пользователем.
wait_timeout
Максимальная длительность неинтерактивного простаивающего подключения в секундах. Если за указанное время подключение не проявляло активности, то по истечение этого времени оно будет принудительно закрыто. По умолчанию - через 8 часов.
interactive_timeout
Максимальная длительность интерактивного простаивающего подключения в секундах. Если за указанное время подключение не проявляло активности, то по истечение этого времени оно будет принудительно закрыто. По умолчанию - через 8 часов. Интерактивным считается подключение, которая при вызове функции mysql_real_connect
(или ей подобной) передала флаг CLIENT_INTERACTIVE
.
Ограничение количества подключений
Указанные выше опции можно использовать для управления количеством подключений, устанавливаемых к серверу MySQL. Опция max_connections
позволяет ограничить общее количество подключений, опция max_user_connetions
- ограничить количество подключений от одного пользователя, а опции wait_timeout
и interactive_timeout
своевременно избавляться от простаивающих подключений.
Поскольку каждому установленному подключению выделяется по одному буферу размерами join_buffer_size
, sort_buffer_size
, read_buffer_size
и read_rnd_buffer_size
, то умножив сумму объёмов этих буферов на значение опции max_connections
, можно узнать максимальный объём памяти, который будет использоваться клиентскими подключениями. Своевременное закрытие простаивающих подключений позволяет повлиять на количество установленных подключений, что может позволить уменьшить значение опции max_connections
и распределить больше свободной памяти для общих буферов MySQL. Дополнительную экономию количества подключений может дать настройка ProxySQL.
Использованные материалы
- MySQL 8.0 Reference Manual / Server System Variables
- Hayden James. Tuning MySQL my.cnf? Avoid this common pitfall! - Настройка MySQL: часто встречающиеся ошибки
- Peter Zaitsev. MySQL: What read_buffer_size Value is Optimal?
- MySQL 5.7 C API Developer Guide / mysql_real_connect()
- MySQL 5.7 Reference Manual / MyISAM Startup Options
- Настройка MySQL: часто встречающиеся ошибки