Tillbaka till bloggen
Januari 27, 2026Guider

Hur man optimerar MySQL-prestanda

Komplett guide för optimering av MySQL-databasprestanda: konfigurationsjustering, frågeoptimering, indexering och övervakning.

Hur man optimerar MySQL-prestanda

MySQL-prestandaoptimering är avgörande för applikationer som hanterar stora mängder data eller hög trafik. Denna guide täcker viktiga tekniker för att förbättra MySQL-prestanda, från konfigurationsjustering till frågeoptimering.

Optimera MySQL-konfiguration

Redigera MySQL-konfigurationsfilen för att optimera prestanda baserat på dina serverresurser:

bash
# Redigera MySQL-konfiguration (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# Redigera MySQL-konfiguration (CentOS/RHEL)
sudo nano /etc/my.cnf

# Lägg till eller ändra dessa inställningar:
[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

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

InnoDB-optimering

InnoDB är MySQL:s standardlagringsmotor. Optimera den för bättre prestanda:

bash
# I /etc/mysql/mysql.conf.d/mysqld.cnf eller /etc/my.cnf
[mysqld]
# InnoDB buffer pool (använd 70-80% av tillgängligt RAM)
innodb_buffer_pool_size = 2G

# InnoDB loggfilstorlek
innodb_log_file_size = 512M

# InnoDB flush-metod (för SSD)
innodb_flush_method = O_DIRECT

# InnoDB I/O-trådar
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# InnoDB flush logg vid transaktionscommit
innodb_flush_log_at_trx_commit = 2

Frågecache-konfiguration

Frågecache kan förbättra prestanda för läsintensiva arbetsbelastningar (Obs: Frågecache är föråldrat i MySQL 8.0):

bash
# För MySQL 5.7 och tidigare
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M

# Kontrollera frågecache-status
mysql> SHOW VARIABLES LIKE 'query_cache%';

# Kontrollera frågecache-statistik
mysql> SHOW STATUS LIKE 'Qcache%';

Indexoptimering

Rätt indexering är avgörande för frågeprestanda:

bash
# Analysera tabell för att uppdatera indexstatistik
ANALYZE TABLE table_name;

# Kontrollera oanvända index
SELECT * FROM sys.schema_unused_indexes;

# Skapa index
CREATE INDEX idx_column ON table_name(column_name);

# Skapa sammansatt index
CREATE INDEX idx_multi ON table_name(col1, col2, col3);

# Visa index
SHOW INDEXES FROM table_name;

# Ta bort oanvänt index
DROP INDEX idx_name ON table_name;

Frågeoptimering

Optimera dina SQL-frågor för bättre prestanda:

  • Använd EXPLAIN för att analysera frågekörningsplaner: EXPLAIN SELECT * FROM table WHERE column = 'value'
  • Undvik SELECT * - välj endast nödvändiga kolumner
  • Använd LIMIT för att begränsa resultatuppsättningar
  • Använd korrekta WHERE-klausuler med indexerade kolumner
  • Undvik funktioner i WHERE-klausuler (t.ex. WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
  • Använd JOINs istället för underfrågor när det är möjligt
  • Använd UNION istället för OR för flera villkor när det är lämpligt

Övervaka MySQL-prestanda

bash
# Kontrollera MySQL-status
mysql> SHOW STATUS;

# Kontrollera långsamma frågor
mysql> SHOW VARIABLES LIKE 'slow_query%';

# Aktivera långsam frågelogg
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

# Kontrollera processlista
mysql> SHOW PROCESSLIST;

# Kontrollera tabellstatus
mysql> SHOW TABLE STATUS LIKE 'table_name';

# Kontrollera InnoDB-status
mysql> SHOW ENGINE INNODB STATUS;

Prestandaoptimerings tips

  • Kör regelbundet OPTIMIZE TABLE för att defragmentera tabeller
  • Övervaka långsam frågelogg och optimera långsamma frågor
  • Använd anslutningspool för att minska anslutningsöverhead
  • Partitionera stora tabeller efter datum eller intervall för bättre prestanda
  • Använd läsrepliker för läsintensiva arbetsbelastningar
  • Håll MySQL uppdaterad till den senaste stabila versionen
  • Övervaka disk I/O och överväg att använda SSD/NVMe-lagring
  • Använd EXPLAIN ANALYZE (MySQL 8.0+) för detaljerad frågeanalys