Метрика

Оптимизация MySQL: диагностика и решение проблем производительности

Рубрики:VDS
Автор: Пряхин Станислав
Время прочтения: мин
Комментариев: нет
04.03.2025

Медленная работа MySQL и постоянные ошибки 502 Bad Gateway — главные враги сайтов на WordPress (Elementor, WooCommerce). В этой статье мы проведем полную диагностику и настроим идеальный баланс между Базой Данных, PHP и Nginx для максимальной производительности сервера.

1

Диагностика и выявление «бутылочного горлышка»

Первым делом проверяем основной параметр — размер буфера InnoDB. Он определяет, сколько данных MySQL может держать в быстрой оперативной памяти.

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
Variable_name Value
innodb_buffer_pool_size 134217728 (128MB)

Проблема: По умолчанию выделено всего 128MB. Если ваша база данных (например, 628MB) больше этого значения, сервер начинает читать данные с диска, что вызывает скачки CPU до 400%.

2

Оптимизация MySQL: Настройка my.cnf

Для стабильной работы WordPress нам нужно выделить достаточно памяти под базу, оставив запас для тяжелых PHP-процессов Elementor.

Актуальный баланс: Для сервера с 8GB RAM оптимально выделить 2GB под MySQL. Это покроет базу в 600-1500MB и оставит место для PHP-процессов, которые при активации WooCommerce могут потреблять до 512MB на каждый поток.

nano /etc/mysql/my.cnf
[mysqld]
# Основной буфер (увеличиваем до 2GB)
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 2

# Оптимизация записи и транзакций
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_flush_method = O_DIRECT

# Ограничение временных таблиц (чтобы избежать Out of Memory)
tmp_table_size = 32M
max_heap_table_size = 32M

# Настройки соединений
max_connections = 150
skip_name_resolve = 1
3

Индексация и чистка мусора

Даже быстрая память не спасет, если запросы не оптимизированы. Мы добавим индексы в самые «медленные» таблицы WordPress.

-- Ускоряем выборку настроек сайта
ALTER TABLE wp_options ADD INDEX idx_autoload (autoload);

-- Оптимизация WooCommerce и логов
ALTER TABLE wp_woocommerce_shipping_zones ADD INDEX idx_zone_order (zone_order);
ALTER TABLE wp_wpmailsmtp_debug_events ADD INDEX idx_created_at (created_at);

-- Чистка раздутых таблиц логов
TRUNCATE TABLE wp_wpmailsmtp_debug_events;
TRUNCATE TABLE wp_rank_math_404_logs;
4

Связка: Nginx + PHP-FPM (Борьба с 502)

Если база работает быстро, но Nginx не может принять тяжелый ответ от PHP, вы увидите «Bad Gateway». Нужно расширить буферы передачи данных.

# Добавьте в конфиг Nginx в блок location ~ \.php$
fastcgi_buffer_size 128k;
fastcgi_buffers 64 64k;
fastcgi_busy_buffers_size 256k;
fastcgi_read_timeout 300;

Почему это важно: Плагины безопасности (Cerber) и конструкторы (Elementor) передают огромные Cookie и заголовки. Без этих настроек Nginx будет «сбрасывать» соединение, считая его ошибочным.

Итоги глобальной оптимизации

Диагностика (Было)

  • База 628MB жила в 128MB памяти
  • Постоянный своп (чтение) с диска
  • Ошибки 502 из-за узких буферов Nginx
  • CPU 400% из-за очереди запросов

Результат (Стало)

  • База полностью в RAM (2GB Buffer Pool)
  • Nginx «проглатывает» любые заголовки
  • Индексы ускорили wp_options в разы
  • Нагрузка на CPU снижена до 15-20%

Теперь ваш сервер работает как единый слаженный механизм. Данные мгновенно отдаются из MySQL в PHP, а Nginx без задержек транслирует их пользователю.

systemctl restart mysql php8.1-fpm nginx

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

WebCreative Studio Logo

🍪 Мы собираем куки. Без них никак. Они нужны для вашего удобства — сайт просто не сможет нормально работать без них.

Создание сайтов в Донецке
Спасибо! Ваша заявка получена. Мы дадим обратную связь в ближайшее время.