Kaip optimizuoti MySQL našumą
Pilnas vadovas MySQL duomenų bazės našumo optimizavimui: konfigūracijos derinimas, užklausų optimizavimas, indeksavimas ir stebėjimas.

MySQL našumo optimizavimas yra labai svarbus programoms, kurios tvarko didelius duomenų kiekius arba didelį srautą. Šis vadovas apima esminius MySQL našumo gerinimo metodus, nuo konfigūracijos derinimo iki užklausų optimizavimo.
MySQL konfigūracijos optimizavimas
Redaguokite MySQL konfigūracijos failą, kad optimizuotumėte našumą pagal savo serverio išteklius:
# Redaguoti MySQL konfigūraciją (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Redaguoti MySQL konfigūraciją (CentOS/RHEL)
sudo nano /etc/my.cnf
# Pridėti arba modifikuoti šiuos nustatymus:
[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
# Perkrauti MySQL
sudo systemctl restart mysql # Ubuntu/Debian
sudo systemctl restart mysqld # CentOS/RHELInnoDB optimizavimas
InnoDB yra MySQL numatytasis saugojimo variklis. Optimizuokite jį geresniam našumui:
# /etc/mysql/mysql.conf.d/mysqld.cnf arba /etc/my.cnf
[mysqld]
# InnoDB buferio talpykla (naudokite 70-80% prieinamos RAM)
innodb_buffer_pool_size = 2G
# InnoDB žurnalo failo dydis
innodb_log_file_size = 512M
# InnoDB išplovimo metodas (SSD)
innodb_flush_method = O_DIRECT
# InnoDB I/O srautai
innodb_read_io_threads = 4
innodb_write_io_threads = 4
# InnoDB žurnalo išplovimas transakcijos patvirtinimo metu
innodb_flush_log_at_trx_commit = 2Užklausų talpyklos konfigūracija
Užklausų talpykla gali pagerinti našumą skaitymo intensyvioms darbo apkrovoms (Pastaba: Užklausų talpykla MySQL 8.0 nebetikima):
# MySQL 5.7 ir ankstesnėms versijoms
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
# Patikrinti užklausų talpyklos būseną
mysql> SHOW VARIABLES LIKE 'query_cache%';
# Patikrinti užklausų talpyklos statistiką
mysql> SHOW STATUS LIKE 'Qcache%';Indeksų optimizavimas
Tinkamas indeksavimas yra labai svarbus užklausų našumui:
# Analizuoti lentelę, kad atnaujintumėte indeksų statistiką
ANALYZE TABLE table_name;
# Patikrinti nenaudojamus indeksus
SELECT * FROM sys.schema_unused_indexes;
# Sukurti indeksą
CREATE INDEX idx_column ON table_name(column_name);
# Sukurti sudėtinį indeksą
CREATE INDEX idx_multi ON table_name(col1, col2, col3);
# Rodyti indeksus
SHOW INDEXES FROM table_name;
# Pašalinti nenaudojamą indeksą
DROP INDEX idx_name ON table_name;Užklausų optimizavimas
Optimizuokite savo SQL užklausas geresniam našumui:
- Naudokite EXPLAIN, kad išanalizuotumėte užklausų vykdymo planus: EXPLAIN SELECT * FROM table WHERE column = 'value'
- Venkite SELECT * - pasirinkite tik reikalingus stulpelius
- Naudokite LIMIT, kad apribotumėte rezultatų rinkinius
- Naudokite tinkamas WHERE sąlygas su indeksuotais stulpeliais
- Venkite funkcijų WHERE sąlygose (pvz., WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
- Kai įmanoma, naudokite JOIN vietoj paklausų
- Tinkamais atvejais naudokite UNION vietoj OR kelioms sąlygoms
MySQL našumo stebėjimas
# Patikrinti MySQL būseną
mysql> SHOW STATUS;
# Patikrinti lėtas užklausas
mysql> SHOW VARIABLES LIKE 'slow_query%';
# Įjungti lėtų užklausų žurnalą
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
# Patikrinti procesų sąrašą
mysql> SHOW PROCESSLIST;
# Patikrinti lentelės būseną
mysql> SHOW TABLE STATUS LIKE 'table_name';
# Patikrinti InnoDB būseną
mysql> SHOW ENGINE INNODB STATUS;Našumo optimizavimo patarimai
- Reguliariai vykdykite OPTIMIZE TABLE, kad defragmentuotumėte lenteles
- Stebėkite lėtų užklausų žurnalą ir optimizuokite lėtas užklausas
- Naudokite ryšių grupavimą, kad sumažintumėte ryšio pridėtinius kaštus
- Didesniam našumui dideles lenteles skirstykite pagal datą arba diapazoną
- Skaitymo intensyvioms darbo apkrovoms naudokite skaitymo kopijas
- Laikykite MySQL atnaujintą iki naujausios stabilios versijos
- Stebėkite disko I/O ir apsvarstykite SSD/NVMe saugojimo naudojimą
- Išsamiems užklausų analizėms naudokite EXPLAIN ANALYZE (MySQL 8.0+)