Powrót do bloga
Styczeń 27, 2026Poradniki

Jak zoptymalizować wydajność MySQL

Kompletny przewodnik dotyczący optymalizacji wydajności bazy danych MySQL: dostrajanie konfiguracji, optymalizacja zapytań, indeksowanie i monitorowanie.

Jak zoptymalizować wydajność MySQL

Optymalizacja wydajności MySQL jest kluczowa dla aplikacji obsługujących duże ilości danych lub wysoki ruch. Ten przewodnik obejmuje niezbędne techniki poprawy wydajności MySQL, od dostrajania konfiguracji do optymalizacji zapytań.

Optymalizacja konfiguracji MySQL

Edytuj plik konfiguracyjny MySQL, aby zoptymalizować wydajność na podstawie zasobów serwera:

bash
# Edytuj konfigurację MySQL (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# Edytuj konfigurację MySQL (CentOS/RHEL)
sudo nano /etc/my.cnf

# Dodaj lub zmodyfikuj te ustawienia:
[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

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

Optymalizacja InnoDB

InnoDB to domyślny silnik przechowywania MySQL. Zoptymalizuj go dla lepszej wydajności:

bash
# W /etc/mysql/mysql.conf.d/mysqld.cnf lub /etc/my.cnf
[mysqld]
# Pula buforów InnoDB (użyj 70-80% dostępnej pamięci RAM)
innodb_buffer_pool_size = 2G

# Rozmiar pliku dziennika InnoDB
innodb_log_file_size = 512M

# Metoda opróżniania InnoDB (dla SSD)
innodb_flush_method = O_DIRECT

# Wątki I/O InnoDB
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# Opróżnianie dziennika InnoDB przy zatwierdzaniu transakcji
innodb_flush_log_at_trx_commit = 2

Konfiguracja pamięci podręcznej zapytań

Pamięć podręczna zapytań może poprawić wydajność dla obciążeń intensywnie czytających (Uwaga: pamięć podręczna zapytań jest przestarzała w MySQL 8.0):

bash
# Dla MySQL 5.7 i wcześniejszych
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M

# Sprawdź status pamięci podręcznej zapytań
mysql> SHOW VARIABLES LIKE 'query_cache%';

# Sprawdź statystyki pamięci podręcznej zapytań
mysql> SHOW STATUS LIKE 'Qcache%';

Optymalizacja indeksów

Właściwa indeksacja jest kluczowa dla wydajności zapytań:

bash
# Przeanalizuj tabelę, aby zaktualizować statystyki indeksów
ANALYZE TABLE table_name;

# Sprawdź nieużywane indeksy
SELECT * FROM sys.schema_unused_indexes;

# Utwórz indeks
CREATE INDEX idx_column ON table_name(column_name);

# Utwórz indeks złożony
CREATE INDEX idx_multi ON table_name(col1, col2, col3);

# Wyświetl indeksy
SHOW INDEXES FROM table_name;

# Usuń nieużywany indeks
DROP INDEX idx_name ON table_name;

Optymalizacja zapytań

Zoptymalizuj swoje zapytania SQL dla lepszej wydajności:

  • Użyj EXPLAIN do analizy planów wykonania zapytań: EXPLAIN SELECT * FROM table WHERE column = 'value'
  • Unikaj SELECT * - wybieraj tylko potrzebne kolumny
  • Użyj LIMIT, aby ograniczyć zestawy wyników
  • Użyj odpowiednich klauzul WHERE z indeksowanymi kolumnami
  • Unikaj funkcji w klauzulach WHERE (np. WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
  • Użyj JOIN zamiast podzapytań, gdy to możliwe
  • Użyj UNION zamiast OR dla wielu warunków, gdy jest to odpowiednie

Monitorowanie wydajności MySQL

bash
# Sprawdź status MySQL
mysql> SHOW STATUS;

# Sprawdź wolne zapytania
mysql> SHOW VARIABLES LIKE 'slow_query%';

# Włącz dziennik wolnych zapytań
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

# Sprawdź listę procesów
mysql> SHOW PROCESSLIST;

# Sprawdź status tabeli
mysql> SHOW TABLE STATUS LIKE 'table_name';

# Sprawdź status InnoDB
mysql> SHOW ENGINE INNODB STATUS;

Wskazówki dotyczące optymalizacji wydajności

  • Regularnie uruchamiaj OPTIMIZE TABLE, aby defragmentować tabele
  • Monitoruj dziennik wolnych zapytań i optymalizuj wolne zapytania
  • Używaj puli połączeń, aby zmniejszyć narzut połączeń
  • Partycjonuj duże tabele według daty lub zakresu dla lepszej wydajności
  • Używaj replik tylko do odczytu dla obciążeń intensywnie czytających
  • Utrzymuj MySQL zaktualizowany do najnowszej stabilnej wersji
  • Monitoruj I/O dysku i rozważ użycie pamięci SSD/NVMe
  • Użyj EXPLAIN ANALYZE (MySQL 8.0+) do szczegółowej analizy zapytań