본문 바로가기

Program

MySQL 성능 튜닝. 접속자 수 증가로 인한 읽기/쓰기 성능 개선 방법.

반응형

 

🔧 MySQL 성능 튜닝 완전 정복 – 설정 조정으로 쾌속 DB 만들기!

MySQL은 웹서비스, 쇼핑몰, 게임, 사내 시스템 등 다양한 분야에서 사용되는 대표적인 관계형 데이터베이스입니다. 하지만 기본 설정만으로는 성능을 제대로 끌어낼 수 없기 때문에, 설정 파일(my.cnf)을 조정하여 성능을 튜닝하는 것이 매우 중요합니다.

이 글에서는 MySQL 설정 조정을 통해 성능을 끌어올리는 방법을 예제와 함께 자세히 설명드립니다.


📁 MySQL 설정 파일 위치

MySQL 설정 파일은 운영체제나 설치 방식에 따라 위치가 다를 수 있습니다.

# 대표적인 설정 파일 경로
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf

대부분 [mysqld] 섹션에 설정을 추가합니다.


 

 

1️⃣ 메모리 관련 설정

✅ innodb_buffer_pool_size

역할: InnoDB에서 사용되는 주요 캐시. 테이블 데이터와 인덱스를 메모리에 올려 디스크 I/O를 줄입니다.

  • 추천값: InnoDB만 사용하는 경우 전체 RAM의 60~80%
  • 예시:
innodb_buffer_pool_size = 8G  # 서버 메모리가 16GB일 경우

📌 실전 팁:

  • RAM이 부족한 경우 너무 크게 잡으면 오히려 시스템이 스왑을 사용해 느려집니다.
  • 여러 개의 버퍼 풀로 나누고 싶다면:
innodb_buffer_pool_instances = 4

2️⃣ 쿼리 캐시 설정 (MySQL 5.7 이하 전용)

MySQL 5.7 이하에서는 쿼리 결과를 캐싱하는 기능이 제공되지만, 쓰기 작업이 많은 시스템에서는 비효율적입니다.

✅ 비활성화 추천 예시:

query_cache_type = 0
query_cache_size = 0

✅ 활성화 예시 (읽기 위주 시스템):

query_cache_type = 1
query_cache_size = 64M

MySQL 8.0 이상에서는 이 기능이 완전히 제거되었습니다.


3️⃣ 연결 및 스레드 관련 설정

✅ max_connections

역할: 동시에 연결 가능한 최대 클라이언트 수
기본값은 보통 151입니다.

  • 예시:
max_connections = 300

📌 실전 예시:

  • 트래픽이 많은 웹사이트라면 300~500까지 설정 가능하지만, 시스템 메모리 확인 필수!

✅ thread_cache_size

역할: 스레드를 재사용해 생성 비용 절감

  • 예시:
thread_cache_size = 16

SHOW STATUS LIKE 'Threads_created'; 결과가 많으면 증가 필요.


4️⃣ InnoDB 설정

✅ innodb_log_file_size

역할: InnoDB 트랜잭션 로그 파일 크기. 쓰기 성능에 영향을 줍니다.

  • 예시:
innodb_log_file_size = 512M

변경 시 기존 로그 파일을 삭제해야 에러가 발생하지 않습니다.

✅ innodb_flush_log_at_trx_commit

역할: 트랜잭션 커밋 시 로그를 어떻게 플러시할지 결정

  • 옵션 설명:
    • 1: 가장 안전 (기본값) – 성능은 낮음
    • 2: OS 캐시까지만 기록 – 성능 향상, 안정성 양호
    • 0: 메모리에만 저장 – 최고 성능, 장애 시 데이터 손실 가능
  • 예시:
innodb_flush_log_at_trx_commit = 2

📌 실전 상황:

  • 전자상거래/금융 등에서는 1
  • 블로그/게시판 등 일반 서비스에서는 2

5️⃣ 디스크 I/O 설정

✅ innodb_io_capacity

역할: InnoDB가 디스크에 플러시할 수 있는 I/O 작업 수

  • HDD 환경:
innodb_io_capacity = 200
  • SSD 환경:
innodb_io_capacity = 1000
innodb_io_capacity_max = 2000

📌 실전 팁: IOPS가 높은 스토리지를 쓴다면 높여서 성능 향상 가능


6️⃣ 슬로우 쿼리 로그 설정

성능 병목의 핵심 원인인 느린 쿼리를 추적하기 위해 활성화해야 할 기능입니다.

✅ 설정 예시:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1  # 1초 이상 걸리는 쿼리 기록
log_queries_not_using_indexes = 1

📌 mysqldumpslow, pt-query-digest 등의 도구로 분석 가능


🧪 실시간 상태 확인 명령어

SHOW VARIABLES LIKE 'innodb%';       -- 현재 설정 확인
SHOW STATUS LIKE 'Threads%';         -- 연결 상태 체크
SHOW PROCESSLIST;                    -- 실행 중 쿼리 확인

반응형

 

 

🛠 추천 도구 & 참고자료


✅ 마무리 정리

튜닝 항목 설명 추천 설정

innodb_buffer_pool_size 데이터/인덱스 캐시 RAM의 60~80%
max_connections 최대 연결 수 200~500
innodb_flush_log_at_trx_commit 데이터 안전성 조절 1(안정), 2(속도)
innodb_io_capacity 디스크 처리량 제어 HDD=200, SSD=1000+
slow_query_log 느린 쿼리 분석 반드시 활성화

💬 더 빠르게! 더 안정적으로!

MySQL은 설정만 잘해도 속도가 몇 배 빨라지고, 서버 자원도 효율적으로 사용할 수 있습니다. 서버 사양, 데이터 양, 트래픽 상황을 고려해 맞춤 튜닝을 진행해보세요!

궁금한 점이나 서버 환경에 맞춘 my.cnf 맞춤 튜닝 요청은 댓글로 남겨주세요 😊

 

반응형