Kako optimizirati MySQL performanse
Potpuni vodič za optimizaciju performansi MySQL baze podataka: podešavanje konfiguracije, optimizacija upita, indeksiranje i nadzor.

Optimizacija performansi MySQL je ključna za aplikacije koje obrađuju velike količine podataka ili visok promet. Ovaj vodič pokriva bitne tehnike za poboljšanje MySQL performansi, od podešavanja konfiguracije do optimizacije upita.
Optimizacija MySQL konfiguracije
Uredite MySQL konfiguracijsku datoteku da optimizirate performanse na temelju resursa vašeg poslužitelja:
# Uredite MySQL konfiguraciju (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
# Uredite MySQL konfiguraciju (CentOS/RHEL)
sudo nano /etc/my.cnf
# Dodajte ili modificirajte ove postavke:
[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
# Ponovno pokrenite MySQL
sudo systemctl restart mysql # Ubuntu/Debian
sudo systemctl restart mysqld # CentOS/RHELOptimizacija InnoDB
InnoDB je zadani MySQL storage engine. Optimizirajte ga za bolje performanse:
# U /etc/mysql/mysql.conf.d/mysqld.cnf ili /etc/my.cnf
[mysqld]
# InnoDB međuspremnik (koristite 70-80% dostupne RAM memorije)
innodb_buffer_pool_size = 2G
# Veličina InnoDB log datoteke
innodb_log_file_size = 512M
# InnoDB metoda flush (za SSD)
innodb_flush_method = O_DIRECT
# InnoDB I/O dretve
innodb_read_io_threads = 4
innodb_write_io_threads = 4
# InnoDB flush log pri commit transakcije
innodb_flush_log_at_trx_commit = 2Konfiguracija cache upita
Cache upita može poboljšati performanse za radna opterećenja s velikim čitanjem (Napomena: Cache upita je zastario u MySQL 8.0):
# Za MySQL 5.7 i ranije
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M
# Provjerite status cache upita
mysql> SHOW VARIABLES LIKE 'query_cache%';
# Provjerite statistike cache upita
mysql> SHOW STATUS LIKE 'Qcache%';Optimizacija indeksa
Pravilno indeksiranje je ključno za performanse upita:
# Analizirajte tablicu da ažurirate statistike indeksa
ANALYZE TABLE table_name;
# Provjerite nekorištene indekse
SELECT * FROM sys.schema_unused_indexes;
# Stvorite indeks
CREATE INDEX idx_column ON table_name(column_name);
# Stvorite kompozitni indeks
CREATE INDEX idx_multi ON table_name(col1, col2, col3);
# Prikažite indekse
SHOW INDEXES FROM table_name;
# Obrišite nekorišteni indeks
DROP INDEX idx_name ON table_name;Optimizacija upita
Optimizirajte svoje SQL upite za bolje performanse:
- Koristite EXPLAIN za analizu planova izvršavanja upita: EXPLAIN SELECT * FROM table WHERE column = 'value'
- Izbjegavajte SELECT * - odaberite samo potrebne stupce
- Koristite LIMIT da ograničite skupove rezultata
- Koristite pravilne WHERE klauzule s indeksiranim stupcima
- Izbjegavajte funkcije u WHERE klauzulama (npr., WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
- Koristite JOIN umjesto podupita kada je moguće
- Koristite UNION umjesto OR za više uvjeta kada je prikladno
Nadzor MySQL performansi
# Provjerite status MySQL
mysql> SHOW STATUS;
# Provjerite spore upite
mysql> SHOW VARIABLES LIKE 'slow_query%';
# Omogućite log spore upite
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
# Provjerite popis procesa
mysql> SHOW PROCESSLIST;
# Provjerite status tablice
mysql> SHOW TABLE STATUS LIKE 'table_name';
# Provjerite InnoDB status
mysql> SHOW ENGINE INNODB STATUS;Savjeti za optimizaciju performansi
- Redovito pokrenite OPTIMIZE TABLE da defragmentirate tablice
- Nadzirite log sporih upita i optimizirajte spore upite
- Koristite povezivanje u skupove da smanjite opterećenje veza
- Particionirajte velike tablice po datumu ili rasponu za bolje performanse
- Koristite replike za čitanje za radna opterećenja s velikim čitanjem
- Držite MySQL ažuriran na najnoviju stabilnu verziju
- Nadzirite disk I/O i razmislite o korištenju SSD/NVMe pohrane
- Koristite EXPLAIN ANALYZE (MySQL 8.0+) za detaljnu analizu upita