Як аптымізаваць прадукцыйнасць MySQL
Поўны даведнік па аптымізацыі прадукцыйнасці базы даных MySQL: налада канфігурацыі, аптымізацыя запытаў, індэксаванне і маніторынг.

Аптымізацыя прадукцыйнасці MySQL крытычна важная для прыкладанняў, якія апрацоўваюць вялікія аб'ёмы даных або высокі трафік. Гэты даведнік ахоплівае асноўныя тэхнікі паляпшэння прадукцыйнасці MySQL, ад налады канфігурацыі да аптымізацыі запытаў.
Аптымізацыя канфігурацыі MySQL
Адрэдагуйце файл канфігурацыі MySQL для аптымізацыі прадукцыйнасці на аснове рэсурсаў вашага сервера:
# Рэдагаваць канфігурацыю 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. Аптымізуйце яго для лепшай прадукцыйнасці:
# У /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):
# Для 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%';Аптымізацыя індэксаў
Правільнае індэксаванне крытычна важнае для прадукцыйнасці запытаў:
# Прааналізаваць табліцу для абнаўлення статыстыкі індэксаў
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')
- Выкарыстоўвайце JOINs замест падзапытаў, калі магчыма
- Выкарыстоўвайце UNION замест OR для некалькіх умоў, калі гэта дапасоўваецца
Маніторынг прадукцыйнасці MySQL
# Праверыць стан 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+) для падрабязнага аналізу запытаў