1. Buffer Pool
- InnoDB의 핵심 영역으로 메모리 내에 데이터와 인덱스 정보를 캐시하고 Write Buffer의 역할을 한다. MyISAM에도 캐시 영역이 있었지만 주로 인덱스를 캐시하였다.
- my.cnf 내 innodb_buffer_pool_size로 설정하며 로그 내 "Initializing buffer pool, size=” 문구로 확인하거나 mysql> 프롬프트에서도 확인 가능하다.
- mysql> SHOW STATUS LIKE '%innodb_buffer_pool%';
- 만약 Hit Ratio가 낮다면 Buffer Pool 증설을 검토한다. 권장 값은 전체 메모리의 50~80%이며 Buffer Pool이 너무 크면 가상 메모리를 사용하여 오히려 성능이 떨어질 수 있기 때문에 주의헤야 한다. vmstat 명령어를 통해 swap 사용률을 면멸히 모니터링한다. Buffer Pool Hit Ratio 공식은 다음과 같다.
1 - (innodb_buffer_pool_reads / innodb_buffer_pool_read_requests)
- 체크포인트 시 write 스레드가 필요한 만큼 디스크로 write
- Oracle의 Data Buffer Cache와 유사 (Oracle과 마찬가지로 디스크에 바로 쓰지 않고 메모리에 먼저 변경)
2. Undo
Oracle의 Undo와 유사한 Rollback을 위한 공간
3. Insert Buffer
- 데이터의 Insert와 Update 발생 시 인덱스에도 반영해야 하는데 테이블에 인덱스가 많다면 많은 자원을 필요로 하기 때문에 별도의 Insert Buffer 공간을 통해 성능 저하를 방지한다. (단 MySQL 5.5 이전 버전은 Insert만 지원)
- Secondary Index의 Insert 작업을 위한 buffer
- innodb_change_buffering 설정을 이용한다.
4. Log Buffer
- Oracle의 Redo Log Buffer오 유사
- Commit 발행 시 물리 디스크에 바로 변경하는 것이 아니라 ACID를 보장하면서 체크포인트 발생 시 일괄적으로 변경하여 부하 발생을 최소화한다.
- 만약 BLOB이나 Text와 같이 대량 데이터를 취급한다면 다소 크게 설정하는 것이 좋다.
5. 모니터링
- Mutex 상태 보기
show engine innodb mutex
- Buffer I/O, 스레드 등
show engine innodb status