MySQL InnoDB는 MySQL의 기본 스토리지 엔진으로, ACID 트랜잭션, 외래 키, MVCC를 지원한다. InnoDB의 내부 구조를 이해하면 쿼리 성능과 잠금 전략을 효과적으로 최적화할 수 있다.
InnoDB 아키텍처
메모리 구조:
Buffer Pool: 데이터/인덱스 캐시 (가장 중요, RAM의 70~80% 권장)
Log Buffer: Redo Log 버퍼
Change Buffer: 보조 인덱스 변경 버퍼
디스크 구조:
Tablespace (.ibd): 데이터 + 인덱스 (테이블별 파일)
Redo Log: 트랜잭션 내구성 (ib_logfile0, 1)
Undo Log: MVCC 이전 버전 데이터
Doublewrite Buffer: 쓰기 안전성 (partial write 방지)
클러스터드 인덱스:
- 기본 키로 데이터가 물리적으로 정렬
- 기본 키 없으면 내부 rowid 사용
- 보조 인덱스는 기본 키 값을 포함
트랜잭션 격리 수준 & MVCC
sql
-- 격리 수준 확인/변경
SELECT @@transaction_isolation;
SET SESSION transaction_isolation = 'READ-COMMITTED';
-- MVCC: 읽기는 스냅샷 기반 (잠금 없음)
-- READ COMMITTED: 각 쿼리마다 새 스냅샷
-- REPEATABLE READ (기본): 트랜잭션 시작 시 스냅샷 고정
-- 잠금 확인
SELECT
r.trx_id AS waiting_trx,
r.trx_mysql_thread_id AS waiting_thread,
b.trx_id AS blocking_trx,
b.trx_mysql_thread_id AS blocking_thread
FROM information_schema.innodb_lock_waits w
JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
중요 설정 파라미터
ini
[mysqld]
# Buffer Pool: 총 RAM의 70~80%
innodb_buffer_pool_size = 8G
innodb_buffer_pool_instances = 8 # CPU 코어에 맞게
# Redo Log: 쓰기 성능 vs 복구 시간 균형
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
# 플러시 동작: 1=완전 내구성, 2=성능 우선
innodb_flush_log_at_trx_commit = 1
innodb_flush_method = O_DIRECT
# 병렬 I/O
innodb_io_capacity = 2000
innodb_read_io_threads = 8
innodb_write_io_threads = 8
관련 문서