반응형
MySQL 성능을 결정짓는 핵심은 my.cnf 설정이다.
하지만 대부분의 사용자는 기본 설정 그대로 사용하거나, 무작정 따라한 설정을 적용해 병목을 유발하는 경우가 많다.

💻 기본 테스트/개발 서버 설정 (RAM 2GB 이하)
테스트용 서버라면 무리한 설정은 피해야 한다.
[mysqld]
max_connections = 50
innodb_buffer_pool_size = 512M
sort_buffer_size = 512K
read_buffer_size = 512K
query_cache_type = 0
tmp_table_size = 32M
max_allowed_packet = 32M
- 캐시 기능은 OFF로 두고, 기본적인 버퍼만 확보
- max_connections는 낮게 설정
반응형
🖥️ 중소형 운영 서버 (RAM 4GB ~ 8GB, 일반 웹서비스)
대부분의 개인/중소 웹서비스 환경에서 사용되는 스펙
[mysqld]
max_connections = 150
innodb_buffer_pool_size = 3G
innodb_log_file_size = 256M
sort_buffer_size = 1M
read_buffer_size = 1M
join_buffer_size = 1M
tmp_table_size = 128M
max_allowed_packet = 64M
query_cache_type = 0
- 버퍼풀 메모리를 가장 많이 할당
- 정렬 버퍼와 조인 버퍼를 기본 수준으로 확대
- 쿼리 캐시는 MySQL 5.x 사용 시에도 비활성화 추천
🧠 대용량 트래픽 운영 서버 (RAM 16GB 이상, OLTP)
트랜잭션 중심 서비스, 커머스, 금융 서비스 등에서 필요한 설정
[mysqld]
max_connections = 300
innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances = 12
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
tmp_table_size = 256M
max_allowed_packet = 128M
sort_buffer_size = 2M
read_buffer_size = 2M
join_buffer_size = 2M
- RAM의 70~80%를 버퍼풀에 할당
- I/O 병목 방지를 위한 O_DIRECT 설정
- 인스턴스 분할로 멀티스레드 최적화
- flush 설정은 데이터 안정성 확보
📊 분석/보고서 중심 서버 (OLAP, BI 등)
읽기 비중이 높고, 복잡한 SELECT 쿼리가 많은 환경
[mysqld]
max_connections = 100
innodb_buffer_pool_size = 10G
sort_buffer_size = 4M
read_buffer_size = 4M
join_buffer_size = 4M
tmp_table_size = 512M
max_heap_table_size = 512M
query_cache_type = 0
- 정렬/조인/읽기 버퍼에 충분한 메모리 배분
- OLTP보다 동시 접속 수가 적으므로 max_connections는 낮춰도 무방
- 쿼리 캐시는 제거하고, 대신 인덱싱과 쿼리 튜닝을 활용
반응형
🛠️ 운영환경 설정 시 참고 기준
| 항목 | 추천 기준 |
| innodb_buffer_pool_size | RAM의 60~80% |
| sort_buffer_size | 1~4MB (쿼리 복잡도 따라 조정) |
| join_buffer_size | 1~4MB (다중 테이블 JOIN 대비) |
| tmp_table_size | 64MB 이상 |
| max_connections | 예상 동시 접속 수 + 여유값 |
| query_cache_type | 대부분 OFF (0) |
| innodb_flush_method | O_DIRECT 또는 fsync() |
| max_allowed_packet | 최소 64MB 이상 |
📈 실무 팁
- 트래픽 변화에 따라 주기적으로 조정 필요
- SHOW STATUS, Performance Schema로 리소스 사용량 정기 확인
- 설정 변경 전 반드시 기존 설정 백업
- 재시작 없는 동적 변경은 SET GLOBAL 사용 가능하지만, 재시작 후 초기화됨
✅ 정리
- 운영환경별로 최적 설정은 완전히 다르며, 하드웨어에 맞춰 조정해야 한다.
- 대부분의 설정은 버퍼 메모리 조정이 핵심이며, 너무 보수적으로 잡으면 성능 손해가 발생한다.
- 쿼리 캐시는 과감하게 꺼두고, 캐시 대신 인덱스 튜닝과 Buffer Pool 활용이 정답이다.
🔗 공식 문서 참고
MySQL 8.0 Reference Manual – Server Option and Variable Reference
반응형
'DB' 카테고리의 다른 글
| [MySQL] (트랜잭션 격리수준3️⃣) REPEATABLE READ vs SERIALIZABLE 차이 완전분석 (0) | 2025.07.16 |
|---|---|
| [MySQL] (트랜잭션 격리수준2️⃣) READ UNCOMMITTED vs READ COMMITTED (0) | 2025.07.15 |
| [MySQL] (트랜잭션 격리수준1️⃣) 격리 수준이란? 4단계 개념 정복 (0) | 2025.07.15 |
| [MySQL] (환경설정6️⃣) 자주 실수하는 my.cnf 설정 오류 사례 (0) | 2025.07.15 |
| [MySQL] (환경설정4️⃣) query_cache는 아직 유효한가? 설정 전략 분석 (0) | 2025.07.15 |
| [MySQL] (환경설정3️⃣) 정렬 성능 향상: sort_buffer_size 설정법 (1) | 2025.07.14 |
| [MySQL] (환경설정2️⃣) InnoDB Buffer Pool 최적화 전략 (2) | 2025.07.14 |
| [MySQL] (환경설정1️⃣) my.cnf 구조와 설정 항목 총정리 (0) | 2025.07.14 |