Назад до блогу
Січень 27, 2026Посібники

Як оптимізувати продуктивність MySQL

Повний посібник з оптимізації продуктивності бази даних MySQL: налаштування конфігурації, оптимізація запитів, індексація та моніторинг.

Як оптимізувати продуктивність MySQL

Оптимізація продуктивності MySQL критично важлива для додатків, які обробляють великі обсяги даних або високий трафік. Цей посібник охоплює основні техніки для покращення продуктивності MySQL, від налаштування конфігурації до оптимізації запитів.

Оптимізація конфігурації MySQL

Відредагуйте файл конфігурації MySQL для оптимізації продуктивності на основі ресурсів вашого сервера:

bash
# Редагуйте конфігурацію MySQL (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# Редагуйте конфігурацію MySQL (CentOS/RHEL)
sudo nano /etc/my.cnf

# Додайте або змініть ці налаштування:
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
query_cache_size = 64M
query_cache_type = 1
tmp_table_size = 64M
max_heap_table_size = 64M

# Перезапустіть MySQL
sudo systemctl restart mysql  # Ubuntu/Debian
sudo systemctl restart mysqld   # CentOS/RHEL

Оптимізація InnoDB

InnoDB — це движок зберігання за замовчуванням MySQL. Оптимізуйте його для кращої продуктивності:

bash
# У /etc/mysql/mysql.conf.d/mysqld.cnf або /etc/my.cnf
[mysqld]
# Пул буферів InnoDB (використовуйте 70-80% доступної RAM)
innodb_buffer_pool_size = 2G

# Розмір файлу журналу InnoDB
innodb_log_file_size = 512M

# Метод скидання InnoDB (для SSD)
innodb_flush_method = O_DIRECT

# Потоки I/O InnoDB
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# Скидання журналу InnoDB при підтвердженні транзакції
innodb_flush_log_at_trx_commit = 2

Конфігурація кешу запитів

Кеш запитів може покращити продуктивність для навантажень з інтенсивним читанням (Примітка: Кеш запитів застарів у MySQL 8.0):

bash
# Для MySQL 5.7 та раніше
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M

# Перевірте статус кешу запитів
mysql> SHOW VARIABLES LIKE 'query_cache%';

# Перевірте статистику кешу запитів
mysql> SHOW STATUS LIKE 'Qcache%';

Оптимізація індексів

Правильна індексація критично важлива для продуктивності запитів:

bash
# Проаналізуйте таблицю для оновлення статистики індексів
ANALYZE TABLE table_name;

# Перевірте невикористані індекси
SELECT * FROM sys.schema_unused_indexes;

# Створіть індекс
CREATE INDEX idx_column ON table_name(column_name);

# Створіть складений індекс
CREATE INDEX idx_multi ON table_name(col1, col2, col3);

# Показати індекси
SHOW INDEXES FROM table_name;

# Видаліть невикористаний індекс
DROP INDEX idx_name ON table_name;

Оптимізація запитів

Оптимізуйте ваші SQL запити для кращої продуктивності:

  • Використовуйте EXPLAIN для аналізу планів виконання запитів: EXPLAIN SELECT * FROM table WHERE column = 'value'
  • Уникайте SELECT * - вибирайте лише необхідні стовпці
  • Використовуйте LIMIT для обмеження наборів результатів
  • Використовуйте правильні WHERE умови з індексованими стовпцями
  • Уникайте функцій у WHERE умовах (напр. WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
  • Використовуйте JOIN замість підзапитів, коли це можливо
  • Використовуйте UNION замість OR для кількох умов, коли це доречно

Моніторинг продуктивності MySQL

bash
# Перевірте статус MySQL
mysql> SHOW STATUS;

# Перевірте повільні запити
mysql> SHOW VARIABLES LIKE 'slow_query%';

# Увімкніть журнал повільних запитів
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

# Перевірте список процесів
mysql> SHOW PROCESSLIST;

# Перевірте статус таблиці
mysql> SHOW TABLE STATUS LIKE 'table_name';

# Перевірте статус InnoDB
mysql> SHOW ENGINE INNODB STATUS;

Поради з оптимізації продуктивності

  • Регулярно виконуйте OPTIMIZE TABLE для дефрагментації таблиць
  • Моніторте журнал повільних запитів та оптимізуйте повільні запити
  • Використовуйте пул з'єднань для зменшення накладних витрат на з'єднання
  • Розділіть великі таблиці за датою або діапазоном для кращої продуктивності
  • Використовуйте репліки для читання для навантажень з інтенсивним читанням
  • Тримайте MySQL оновленим до останньої стабільної версії
  • Моніторте I/O диска та розгляньте використання сховища SSD/NVMe
  • Використовуйте EXPLAIN ANALYZE (MySQL 8.0+) для детального аналізу запитів