Веб-разработка

Оптимизация MySQL и MariaDB на сервере: базовые настройки для сайта

Какие параметры MySQL и MariaDB настроить на VPS, как найти медленные запросы и что сделать на хостинге, чтобы база не тормозила сайт.

Оптимизация MySQL и MariaDB на сервере: базовые настройки для сайта

Базовая оптимизация MySQL или MariaDB на сервере сводится к нескольким шагам: выделить достаточно памяти под буфер InnoDB, включить журнал медленных запросов, добавить недостающие индексы, ограничить число соединений под реальные ресурсы и регулярно чистить «мусор» в таблицах. Для типичного сайта на WordPress или 1С-Битрикс этого хватает, чтобы база перестала быть узким местом.

Ниже — понятная инструкция для владельца сайта на VPS: какие параметры менять, как рассчитать значения, как найти медленные запросы и что можно сделать на виртуальном хостинге, где доступа к настройкам сервера нет.

Сервер базы данных: от его настройки зависит скорость сайта

Как понять, что тормозит именно база данных

Медленный сайт не всегда означает медленную базу. Признаки того, что проблема в MySQL:

  • процесс mysqld или mariadbd постоянно занимает большую долю процессора;
  • страницы с фильтрами каталога, поиском и личным кабинетом открываются заметно дольше простых страниц;
  • в админке CMS долго сохраняются товары или записи;
  • при росте посещаемости появляются ошибки «Too many connections» или «Error establishing a database connection».

Быстро посмотреть нагрузку можно утилитой top или htop, а активные запросы — прямо в консоли MySQL:

sudo mysql -e "SHOW FULL PROCESSLIST;"
sudo mysql -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';"

Если в списке процессов постоянно висят одни и те же долгие запросы, значит, есть что оптимизировать. Общий подход к диагностике — в статье почему сайт тормозит.

MySQL или MariaDB: есть ли разница

MariaDB — ответвление MySQL, совместимое с ним для подавляющего большинства сайтов. Во многих дистрибутивах Linux по умолчанию ставится именно MariaDB. Параметры, о которых пойдёт речь, называются одинаково и работают похоже. Различия начинаются в продвинутых функциях и в некоторых значениях по умолчанию, поэтому перед изменениями всегда смотрите, что у вас установлено:

mysql --version

Где находятся настройки

Конфигурация хранится в файлах my.cnf. На Ubuntu и Debian свои параметры удобно помещать в отдельный файл, чтобы их не перезаписало обновление пакета:

  • MySQL: /etc/mysql/mysql.conf.d/mysqld.cnf или свой файл в /etc/mysql/conf.d/;
  • MariaDB: /etc/mysql/mariadb.conf.d/50-server.cnf или свой файл в той же папке.

Параметры пишутся в секции [mysqld]. После изменения сервис нужно перезапустить:

sudo systemctl restart mysql
# или
sudo systemctl restart mariadb

Важно: перед любыми изменениями сделайте резервную копию базы (mysqldump) и сохраните исходный файл конфигурации. Ошибка в my.cnf может помешать базе запуститься, и сайт перестанет работать до исправления.

Настройка параметров MySQL на VPS

Главные параметры для сайта

innodb_buffer_pool_size

Самый важный параметр. Это объём оперативной памяти, в которой InnoDB держит данные и индексы. Если база помещается в буфер целиком, большинство запросов обслуживается из памяти, а не с диска. Ориентиры:

  • если на сервере работает только база — до 60–70% оперативной памяти;
  • если на одном VPS сайт, PHP и база (типичный случай) — 25–40% памяти, чтобы хватило PHP-FPM и системе;
  • нет смысла ставить значение сильно больше размера всех баз.

Размер баз можно узнать запросом:

SELECT table_schema, ROUND(SUM(data_length + index_length)/1024/1024) AS mb
FROM information_schema.tables GROUP BY table_schema;

max_connections

Максимальное число одновременных подключений. Слишком большое значение опасно: при всплеске нагрузки каждый поток займёт память, и сервер может уйти в swap. Для небольшого сайта обычно хватает 100–150 соединений; значение должно соответствовать числу процессов PHP-FPM.

innodb_log_file_size и журнал изменений

Размер журнала транзакций влияет на скорость записи. На сайтах с частыми изменениями (магазин, обмен с 1С) слишком маленький журнал замедляет запись. В новых версиях MySQL вместо него используется innodb_redo_log_capacity — проверяйте документацию своей версии.

tmp_table_size и max_heap_table_size

Определяют, какого размера временные таблицы держатся в памяти. Если сложные запросы с сортировкой и группировкой часто создают временные таблицы на диске, умеренное увеличение этих параметров (их ставят одинаковыми) помогает.

Кэш запросов

В MySQL 8 query cache удалён. В MariaDB он есть, но на сайтах с частыми изменениями чаще мешает, чем помогает. Вместо него используйте объектный кэш на стороне приложения — Redis или Memcached.

Пример стартовой конфигурации

Ниже ориентировочные значения для VPS с 4 ГБ памяти, где на одном сервере работают nginx, PHP-FPM и база. Это отправная точка, а не универсальный рецепт.

[mysqld]
innodb_buffer_pool_size = 1G
max_connections = 100
tmp_table_size = 64M
max_heap_table_size = 64M
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
Память VPS innodb_buffer_pool_size (сайт и база на одном сервере) max_connections
2 ГБ 512M 50–80
4 ГБ 1G–1,5G 100
8 ГБ 2G–3G 150
16 ГБ 5G–6G 200

Журнал медленных запросов и индексы

Настройки сервера дают общий выигрыш, но самые большие проблемы обычно в конкретных запросах. Журнал медленных запросов (slow query log) записывает всё, что выполняется дольше заданного порога. Через несколько дней работы посмотрите сводку:

sudo mysqldumpslow -s t -t 10 /var/log/mysql/slow.log

Команда покажет десять запросов, на которые ушло больше всего времени. Для каждого можно выполнить EXPLAIN и посмотреть, использует ли он индекс:

EXPLAIN SELECT * FROM wp_postmeta WHERE meta_key = 'price';

Если в колонке type стоит ALL, а rows — десятки тысяч, запрос перебирает всю таблицу. Часто помогает индекс по нужному полю. Добавлять индексы в таблицы CMS лучше вместе с разработчиком: лишние индексы замедляют запись и могут конфликтовать с обновлениями.

Совет: для автоматической подсказки по параметрам существуют утилиты MySQLTuner и Percona Toolkit. Запускайте их после нескольких суток работы сервера — тогда статистика будет репрезентативной. Рекомендации проверяйте, а не применяйте вслепую.

Анализ медленных запросов к базе данных

Чистка базы данных

Со временем в базе копится лишнее: ревизии записей, просроченные временные данные, логи плагинов, брошенные корзины, сессии. Это увеличивает размер таблиц и замедляет запросы. Что можно делать регулярно:

  1. Ограничить число ревизий записей в CMS и удалить старые.
  2. Очищать временные данные (в WordPress — устаревшие transient-записи).
  3. Удалять таблицы плагинов, которые больше не используются.
  4. Настроить очистку журналов и статистики в Битриксе и модулях магазина.
  5. Периодически выполнять OPTIMIZE TABLE для таблиц, где было много удалений, — в спокойное время, так как операция нагружает сервер.

Что можно сделать на виртуальном хостинге

На хостинге изменить my.cnf нельзя: сервер базы общий для многих клиентов. Но вам доступны чистка базы, удаление лишних плагинов, кэширование на уровне CMS и индексы через phpMyAdmin. Если база всё равно упирается в лимиты тарифа, это сигнал к переезду на VPS. У Timeweb Cloud и AdminVPS можно взять VPS с NVMe-дисками и настроить MySQL под свой проект — актуальные конфигурации и цены сверяйте на сайтах провайдеров. Подробнее в нашем обзор Timeweb и Timeweb Cloud и в статье переезд с хостинга на VPS.

Частые вопросы

Можно ли просто поставить максимум памяти под базу?

Нет. Если база заберёт почти всю память, PHP-FPM и системе не хватит ресурсов, сервер начнёт использовать swap, и сайт станет медленнее, а не быстрее.

Что делать при ошибке Too many connections?

Сначала найдите причину: долгие запросы, зависшие процессы, боты. Увеличение max_connections — временная мера, она лишь откладывает проблему и повышает расход памяти.

Нужно ли выносить базу на отдельный сервер?

Для большинства малых и средних сайтов — нет. Это имеет смысл для крупных магазинов и проектов с высокой нагрузкой, о чём мы писали в статье масштабирование сайта.

Как часто делать резервные копии базы?

Для магазина — минимум ежедневно, для сайта-визитки — раз в несколько дней. Хранить копии нужно вне сервера.

Резервные копии базы данных перед изменением настроек

Если не хотите разбираться сами

Мы в Pear Advert анализируем медленные запросы, подбираем параметры MySQL и MariaDB под ресурсы сервера и чистим базы сайтов на WordPress и 1С-Битрикс. Если не хотите разбираться сами — поможем подобрать и настроить сервер в рамках услуги аренда сервера и хостинга.

В статье есть партнёрские ссылки: если вы зарегистрируетесь по ним, студия получит вознаграждение, для вас цена не меняется.

Читать дальше

Статьи по теме

Начать проект

Давайте сделаем крутой проект вместе

Расскажите о задаче — мы бесплатно проанализируем нишу, предложим решение и назовём сроки со стоимостью. Без навязчивых звонков.

Телефон

8 (926) 837 76 68

Почта

info@pear-advert.ru

Офис

Москва, ул. Гиляровского, 57с1

Оставьте заявку

Ответим в течение рабочего дня

Выберите тип проекта

Данные используются только для ответа на заявку и хранятся не дольше трёх лет.