Проблемы, которые чаще всего возникают обычно связаны с disk IO. Поэтому для начала рассмотрим опции тюнинга производительности именно с этого поинта. Первое, на что нужно посмотреть — тип диска, который у вас задействован под хранение дата-файлов. Использование HDD не совсем хороший кейс, поэтому поскорее рассмотрите его замену на что-то более быстрое, например, SSD. А теперь перейдем к рассмотрению настроек в my.cnf.
— innodb_buffer_pool_size – размер буфера. Если у вас выделенный сервер MySQL, установите его как можно более высоким (потолок — 75% от общего объема доступной RAM). Случай, когда на сервере БД находиться что-то ещё мы не рассматривает, т.к. это нерабочий кейс для высоконагруженных систем.
— innodb_buffer_pool_instances — количество экземпляров буфера. Максимальное значение 64, рекомендуем начать с 16.
— innodb_flush_log_at_trx_commit — стратегия сброса данных на диск при работе MySQL. Значение “0” даст наибольшую производительность.
– innodb_flush_method — определяет метод сброса данных из памяти на диск. Выбор подходящего значения – это выбор между скоростью и надежностью. Поставьте значение O_DIRECT.
– innodb_log_file_size —параметр определяет размер redo лога MySQL. Чем больше размер этого лога, тем меньше дисковых операций с данными делает MySQL. А значит увеличение размера этого файла приводит к росту производительности операций записи. Рекомендуемое значение 1G. После изменения этого параметра, необходимо перезапустить MySQL и очистить текущие логи.
— innodb_read_io_threads, innodb_write_io_threads — количество потоков ввода/вывода файлов. Не переусердствуйте с этими показателями, просто установите эти значения на 8 и оставьте так.
— innodb_old_blocks_time — время хранения в памяти старых блоков данных. Установите 1000 — это поможет вам предотвратить засорение буферного пула из-за случайных сканирований.
— innodb_io_capacity – количество IOPS. Можно установить для этого параметра столько операций записи, сколько может выдержатьдисковая подсистема. Для твердотельных накопителей это число должно составлять не менее нескольких тысяч (хорошим началом может быть 2000) Лучше всего протестировать диски или выполнить математические расчеты для реальных чисел, но значение по умолчанию, равное 200, слишком мало для большинства современных систем.
— sync_binlog=0 — это настройка синхронизации двоичных журналов, но на всякий случай отключите ее, если только не запускаете на сервере что-то еще, кроме Zabbix.
— query_cache_size=0, query_cache_type=0 — это отключит кэш запросов. В большинстве случаев кэш запросов не нужен.
— sort_buffer_size, join_buffer_size, read_rnd_buffer_size — удалите эти параметры или закомментируйте. Параметры добавляют дополнительный функционал работы с буфером, который никак не улучшит производительность.
— innodb_file_per_table=1 — установите значение в 1, чтобы СУБД хранила каждую таблицу в отдельном файле.
Помимо перечисленной конфигурации важно настроить партиционирование таблиц: