블로그로 돌아가기
1월 27, 2026가이드

MySQL 성능을 최적화하는 방법

MySQL 데이터베이스 성능 최적화에 대한 완전한 가이드: 구성 조정, 쿼리 최적화, 인덱싱 및 모니터링.

MySQL 성능을 최적화하는 방법

MySQL 성능 최적화는 대량의 데이터나 높은 트래픽을 처리하는 애플리케이션에 중요합니다. 이 가이드는 구성 조정부터 쿼리 최적화까지 MySQL 성능을 향상시키는 필수 기술을 다룹니다.

MySQL 구성 최적화

서버 리소스를 기반으로 성능을 최적화하기 위해 MySQL 구성 파일을 편집하세요:

bash
# MySQL 구성 편집 (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# MySQL 구성 편집 (CentOS/RHEL)
sudo nano /etc/my.cnf

# 다음 설정을 추가하거나 수정:
[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

# MySQL 재시작
sudo systemctl restart mysql  # Ubuntu/Debian
sudo systemctl restart mysqld   # CentOS/RHEL

InnoDB 최적화

InnoDB는 MySQL의 기본 스토리지 엔진입니다. 더 나은 성능을 위해 최적화하세요:

bash
# /etc/mysql/mysql.conf.d/mysqld.cnf 또는 /etc/my.cnf에서
[mysqld]
# InnoDB 버퍼 풀 (사용 가능한 RAM의 70-80% 사용)
innodb_buffer_pool_size = 2G

# InnoDB 로그 파일 크기
innodb_log_file_size = 512M

# InnoDB 플러시 방법 (SSD용)
innodb_flush_method = O_DIRECT

# InnoDB I/O 스레드
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# 트랜잭션 커밋 시 InnoDB 로그 플러시
innodb_flush_log_at_trx_commit = 2

쿼리 캐시 구성

쿼리 캐시는 읽기 중심 워크로드의 성능을 향상시킬 수 있습니다 (참고: 쿼리 캐시는 MySQL 8.0에서 더 이상 사용되지 않음):

bash
# MySQL 5.7 및 이전 버전용
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M

# 쿼리 캐시 상태 확인
mysql> SHOW VARIABLES LIKE 'query_cache%';

# 쿼리 캐시 통계 확인
mysql> SHOW STATUS LIKE 'Qcache%';

인덱스 최적화

적절한 인덱싱은 쿼리 성능에 중요합니다:

bash
# 인덱스 통계를 업데이트하기 위해 테이블 분석
ANALYZE TABLE table_name;

# 사용되지 않는 인덱스 확인
SELECT * FROM sys.schema_unused_indexes;

# 인덱스 생성
CREATE INDEX idx_column ON table_name(column_name);

# 복합 인덱스 생성
CREATE INDEX idx_multi ON table_name(col1, col2, col3);

# 인덱스 표시
SHOW INDEXES FROM table_name;

# 사용되지 않는 인덱스 삭제
DROP INDEX idx_name ON table_name;

쿼리 최적화

더 나은 성능을 위해 SQL 쿼리를 최적화하세요:

  • EXPLAIN을 사용하여 쿼리 실행 계획 분석: EXPLAIN SELECT * FROM table WHERE column = 'value'
  • SELECT * 피하기 - 필요한 열만 선택
  • 결과 집합을 제한하기 위해 LIMIT 사용
  • 인덱스된 열과 함께 적절한 WHERE 절 사용
  • WHERE 절에서 함수 피하기 (예: WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
  • 가능한 경우 하위 쿼리 대신 JOIN 사용
  • 적절한 경우 여러 조건에 대해 OR 대신 UNION 사용

MySQL 성능 모니터링

bash
# MySQL 상태 확인
mysql> SHOW STATUS;

# 느린 쿼리 확인
mysql> SHOW VARIABLES LIKE 'slow_query%';

# 느린 쿼리 로그 활성화
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

# 프로세스 목록 확인
mysql> SHOW PROCESSLIST;

# 테이블 상태 확인
mysql> SHOW TABLE STATUS LIKE 'table_name';

# InnoDB 상태 확인
mysql> SHOW ENGINE INNODB STATUS;

성능 최적화 팁

  • 테이블을 조각 모음하기 위해 정기적으로 OPTIMIZE TABLE 실행
  • 느린 쿼리 로그를 모니터링하고 느린 쿼리 최적화
  • 연결 오버헤드를 줄이기 위해 연결 풀링 사용
  • 더 나은 성능을 위해 날짜 또는 범위별로 큰 테이블 분할
  • 읽기 중심 워크로드에 읽기 복제본 사용
  • MySQL을 최신 안정 버전으로 업데이트 유지
  • 디스크 I/O 모니터링 및 SSD/NVMe 스토리지 사용 고려
  • 상세한 쿼리 분석을 위해 EXPLAIN ANALYZE (MySQL 8.0+) 사용