Zpět na blog
Leden 27, 2026Návody

Jak optimalizovat výkon MySQL

Kompletní průvodce optimalizací výkonu databáze MySQL: ladění konfigurace, optimalizace dotazů, indexování a monitorování.

Jak optimalizovat výkon MySQL

Optimalizace výkonu MySQL je klíčová pro aplikace zpracovávající velké množství dat nebo vysoký provoz. Tento průvodce pokrývá základní techniky pro zlepšení výkonu MySQL, od ladění konfigurace po optimalizaci dotazů.

Optimalizace konfigurace MySQL

Upravte konfigurační soubor MySQL pro optimalizaci výkonu na základě zdrojů vašeho serveru:

bash
# Upravit konfiguraci MySQL (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# Upravit konfiguraci MySQL (CentOS/RHEL)
sudo nano /etc/my.cnf

# Přidat nebo upravit tato nastavení:
[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

# Restartovat MySQL
sudo systemctl restart mysql  # Ubuntu/Debian
sudo systemctl restart mysqld   # CentOS/RHEL

Optimalizace InnoDB

InnoDB je výchozí úložný engine MySQL. Optimalizujte ho pro lepší výkon:

bash
# V /etc/mysql/mysql.conf.d/mysqld.cnf nebo /etc/my.cnf
[mysqld]
# InnoDB buffer pool (použijte 70-80% dostupné RAM)
innodb_buffer_pool_size = 2G

# Velikost log souboru InnoDB
innodb_log_file_size = 512M

# Metoda flush InnoDB (pro SSD)
innodb_flush_method = O_DIRECT

# I/O vlákna InnoDB
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# Flush log InnoDB při potvrzení transakce
innodb_flush_log_at_trx_commit = 2

Konfigurace cache dotazů

Cache dotazů může zlepšit výkon pro úlohy s intenzivním čtením (Poznámka: Cache dotazů je zastaralá v MySQL 8.0):

bash
# Pro MySQL 5.7 a starší
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M

# Zkontrolovat stav cache dotazů
mysql> SHOW VARIABLES LIKE 'query_cache%';

# Zkontrolovat statistiky cache dotazů
mysql> SHOW STATUS LIKE 'Qcache%';

Optimalizace indexů

Správné indexování je klíčové pro výkon dotazů:

bash
# Analyzovat tabulku pro aktualizaci statistik indexů
ANALYZE TABLE table_name;

# Zkontrolovat nepoužívané indexy
SELECT * FROM sys.schema_unused_indexes;

# Vytvořit index
CREATE INDEX idx_column ON table_name(column_name);

# Vytvořit složený index
CREATE INDEX idx_multi ON table_name(col1, col2, col3);

# Zobrazit indexy
SHOW INDEXES FROM table_name;

# Smazat nepoužívaný index
DROP INDEX idx_name ON table_name;

Optimalizace dotazů

Optimalizujte své SQL dotazy pro lepší výkon:

  • Použijte EXPLAIN pro analýzu plánů provedení dotazů: EXPLAIN SELECT * FROM table WHERE column = 'value'
  • Vyhněte se SELECT * - vybírejte pouze potřebné sloupce
  • Použijte LIMIT pro omezení výsledných sad
  • Použijte správné WHERE klauzule s indexovanými sloupci
  • Vyhněte se funkcím v WHERE klauzulích (např. WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
  • Použijte JOINs místo poddotazů, když je to možné
  • Použijte UNION místo OR pro více podmínek, když je to vhodné

Monitorování výkonu MySQL

bash
# Zkontrolovat stav MySQL
mysql> SHOW STATUS;

# Zkontrolovat pomalé dotazy
mysql> SHOW VARIABLES LIKE 'slow_query%';

# Povolit protokol pomalých dotazů
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

# Zkontrolovat seznam procesů
mysql> SHOW PROCESSLIST;

# Zkontrolovat stav tabulky
mysql> SHOW TABLE STATUS LIKE 'table_name';

# Zkontrolovat stav InnoDB
mysql> SHOW ENGINE INNODB STATUS;

Tipy pro optimalizaci výkonu

  • Pravidelně spouštějte OPTIMIZE TABLE pro defragmentaci tabulek
  • Sledujte protokol pomalých dotazů a optimalizujte pomalé dotazy
  • Používejte sdružování připojení pro snížení režijních nákladů na připojení
  • Dělte velké tabulky podle data nebo rozsahu pro lepší výkon
  • Používejte repliky pro čtení pro úlohy s intenzivním čtením
  • Udržujte MySQL aktualizovaný na nejnovější stabilní verzi
  • Sledujte I/O disku a zvažte použití úložiště SSD/NVMe
  • Používejte EXPLAIN ANALYZE (MySQL 8.0+) pro podrobnou analýzu dotazů