- 튜닝 개념과 방법
튜닝(Tuning)이란 데이터베이스의 성능을 개선하기 위해 SQL 쿼리, 인덱스, 데이터베이스 설정 및 서버 자원 등을 최적화 하는 작업입니다.
데이터베이스를 운영하다 보면 데이터가 증가하거나 동시 접속자가 많아지면서 SQL 실행 시간이 길어지고, DB 응답 속도가 느려지는 문제가 발생할 수 있습니다.
이때 단순히 서버를 재 시작 하거나 자원을 늘리는 것보다는 먼저 성능 저하의 원인을 분석하고, 불필요한 작업을 줄이는 방식으로 개선하는 것이 중요합니다.
튜닝의 목적 : SQL 실행 시간 단축, 불필요한 데이터 읽기 감소, CPU, 메모리, 디스크 I/O 사용량 감소, 동시 사용자 증가에 대한 처리 능력 향상, 서비스 응답 속도 및 안정성 개선 등이 있습니다.
- 튜닝의 핵심 방법
인덱스(Index) 튜닝
인덱스는 데이터 검색을 빠르게 하기 위해 사용하는 자료 구조입니다. 인덱스가 적절하게 구성되면 조건에 맞는 데이터를 찾기 위해 검사해야 하는 행의 수를 줄일 수 있습니다.
인덱스 생성 ex)
CREATE INDEX idx_slow_demo_emailON slow_demo(email);
명령어
설명:
CREATE: 인덱스 생성,
INDEXidx_slow_demo_email: 인덱스 이름
ON:
slow_demo(email)slow_demo 테이블의 email 컬럼에 인덱스 생성
- InnoDB 튜닝
InnoDB는 MySQL에서 가장 일반적으로 사용하는 스토리지 엔진입니다. 트랜잭션, 외래 키, 행 단위 잠금, 장애 복구 기능 등을 지원합니다.
InnoDB 튜닝은 메모리, 로그, 디스크 입출력 등과 관련된 설정을 조정해 데이터베이스의 처리 성능과 안정성을 개선하는 작업입니다.
InnoDB의 메모리 사용은 크게
Buffer Pool: 데이터 페이지와 인덱스 페이지를 캐시.
Log Buffer: redo 로그 내용을 메모리에 임시 저장.
연결별 메모리: 정렬, 조인, 임시 테이블 등 쿼리 실행 과정에서 사용.
운영체제 메모리: 운영체제와 다른 프로세스가 사용하며, 파일 캐시 등에도 활용.
등이 있습니다.
Redo 로그란 데이터베이스에서 장애가 발생했을 때, 이미 수행했거나 수행 중이던 변경 작업을 다시 실행해 데이터를 복구하기 위해 기록해 두는 로그입니다.
innodb_buffer_pool_size – InnoDB 데이터와 인덱스를 캐시하는 메모리의 크기입니다. 가장 먼저 살펴볼 핵심 변수입니다.
innodb_log_buffer_size – 디스크에 기록하기 전 redo 로그 데이터를 임시로 보관하는 메모리 크기입니다.
innodb_redo_log_capacity – redo 로그 저장 공간의 목표 용량을 설정하여 주로 쓰기 작업과 체크포인트 처리에 영향을 줍니다.
*sql 방식은 리부팅시 다시 원래대로 돌아오는 임시 적용 방식이며, 설정파일 방식은 영구 적용입니다.
Buffer Pool 크기 확인
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
총128MIB
SQL 방식 – Buffer Pool 크기 변경(256 MiB로 늘린다고 가정)
SET GLOBAL innodb_buffer_pool_size = 268435456;
설정 파일 방식
vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]아래에 추가[mysqld]innodb_buffer_pool_size = 256Minnodb_log_buffer_size = 16M
재 시작
systemctl restart mysql
redo 로그 임시 메모리 확인
SHOW GLOBAL VARIABLES LIKE 'innodb_log_buffer_size';

redo 로그 용량 확인
SHOW VARIABLES LIKE 'innodb_redo_log_capacity';
SQL 방식 – redo 로그 용량 변경
SET GLOBAL innodb_redo_log_capacity = 268435456;
설정 파일 방식
vi /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]아래에 추가[mysqld]innodb_redo_log_capacity = 256M

재 시작
systemctl restart mysql
*이 글은 본인의 실제 경험과 학습을 기반으로 직접 작성하였으며, AI는 참고용으로만 활용하였습니다.









