InnoDB 버퍼 풀(Buffer Pool)의 역할
InnoDB의 버퍼 풀은 디스크에 저장된 데이터 파일과 인덱스 정보를 메모리에 캐싱하는 MySQL의 핵심 공간입니다. 단순히 데이터를 빠르게 읽어오는 캐시 역할을 넘어, 쓰기 작업을 메모리에 모아뒀다가 한 번에 디스크로 보내는 Write Buffer의 역할도 함께 수행합니다.
일반적으로 INSERT, UPDATE, DELETE와 같은 변경 쿼리는 디스크의 여기저기 위치한 레코드에 랜덤하게 접근합니다. 하지만 InnoDB는 이런 랜덤 I/O를 버퍼 풀에 먼저 반영합니다. 그 이후 변경된 데이터 페이지를 모아서 디스크에 기록하면서 실제 디스크 접근의 횟수와 비용을 크게 줄일 수 있습니다.
버퍼 풀(Buffer Pool)의 크기 설정
버퍼 풀의 크기는 MySQL의 전체 성능과 직접적으로 연결됩니다. 하지만, 단순하게 전체 메모리의 80%와 같이 단순하게 계산하게 되면 안됩니다. 항상 메모리는 누구나 접근할 수 있는 곳이기에 신중해야합니다. 운영체제나 MySQL외 기타 프로세스가 사용하는 메모리까지 고려해야 하며, 여유 있게 설정값을 조정하면서 안정적으로 크기를 선정해야합니다.
버퍼 풀(Buffer Pool)의 구조와 데이터 관리 방식
InnoDB의 버퍼 풀은 페이지(Page) 단위인 기본 16KB로 메모리 공간을 조각내어 관리합니다. 각 데이터 페이지는 실제 테이블의 데이터, 인덱스, Undo/Redo 로그 등을 담고 있습니다.
버퍼 풀의 핵심 자료구조는 세가지 입니다.
(1) Free List
아직 사용자 데이터로 채워지지 않은 빈 페이지의 목록입니다. 신규 쿼리가 디스크에서 데이터를 읽어올 때 할당되는 영역입니다.
(2) LRU(Least Recently Used) List
한 번 읽어온 데이터 페이지를 가능한 오래 메모리에 유지하기 위한 구조입니다. LRU 리스트는 Old, New 영역으로 나뉘어져있습니다. New 영역에서는 실제로 쿼리에서 자주 사용되는 MRU(Most Recently Used)와 유사하게 동작합니다.
(3) Flush List
디스크로 아직 동기화되지 않은 Dirty 데이터 페이지의 변경 시점을 기준으로 관리합니다. 변경이 이루어진 모든 데이터 페이지가 이 리스트에 등록되며, 일정 시점(Check Point Background Flush)에 디스크에 기록됩니다.
버퍼 풀(Buffer Pool)에서의 데이터 읽기와 페이지 승급
1. 쿼리가 필요한 레코드의 데이터 페이지가 버퍼 풀에 있는지 먼저 검사합니다.
1) 어뎁티브 해시 인덱스(Adaptive Hash Index) 또는 테이블의 B-Tree 인덱스를 사용해 빠르게 검색합니다.
2) 이미 존재한다면? 해당 페이지는 MRU(Most Recently Used) 영역으로 승격되어 메모리에 더 오래 남아 있게 됩니다.
2. 데이터 페이지가 없다면?
1) Free List에서 빈 공간을 할당 받아 디스크에서 데이터를 읽어와 버퍼 풀에 적재합니다.
2) 적재된 페이지는 LRU Header에 추가되고, 쿼리에서 실제로 접근이 발생한다면? MRU 영역으로 이동합니다.
3. 버퍼 풀에 상주하는 데이터 페이지는 "최근 접근된 정도(Aging)"에 따라 위치가 조정됩니다.
1) 오래 사용되지 않은 페이지는 LRU 끝으로 밀려나 결국은 제거가 됩니다.
2) 자주 쓰이는 페이지는 MRU 영역에서 계속 유지됩니다.
4. 반복적으로 자주 읽히는 페이지
1) 어뎁티브 해시 인덱스에도 추가되어 더욱 빠른 검색을 지원합니다.
버퍼 풀의 쓰기 및 플러시(Flush) 관리
Flush List에 올라간 Dirty 페이지, 여기서 Dirty 페이지는 Write Thread, Checkpoint, 또는 특정 상황인 예를 들어 버퍼 풀이 압박 받거나 Redo Log 용량이 임계치에 다다른 순간에서 일괄적으로 디스크에 동기화됩니다. 즉 Flush 된다는 의미입니다.
디스크에서 읽은 데이터로만 구성된 페이지는 변경이 없으므로 Flush List로 옮겨지지 않습니다.
실무적 주의점 및 요약
버퍼 풀 크기를 무작정 크게 80%에 맞춘다면? 사실 Real MySQL에서는 80%가 적정수준이다? 잘못 읽었을 수도 있다. 하여튼 이렇게 맞춰주게 된다면? OS에서 Swap이 발생하거나 메모리 부족 현상이 일어날 수 있습니다.
버퍼 풀은 효율적이어야합니다. 버퍼 풀의 효율이 높으면 Random Disk I/O가 대폭 감소하게 됩니다. Disk I/O에 접근할 일이 줄어든다는 의미가 됩니다. 대용량 데이터도 빠르게 처리할 수 있게 됩니다.
innodb_buffer_pool_hit_ratio, innodb_buffer_pool_reads, innodb_buffer_pool_pages_dirty 등 버퍼 풀 관련 지표를 주기적으로 점검해 운영 환경에 맞게 최적화하는 것이 중요합니다.
'CS > 데이터베이스' 카테고리의 다른 글
MySQL의 기본 -5 (0) | 2025.06.02 |
---|---|
MySQL의 기본 -4 (0) | 2025.06.01 |
MySQL의 기본 -2 (0) | 2025.06.01 |
MySQL의 기본(이해가 필요한 내용 다시 읽어보기) -1 (0) | 2025.06.01 |
Redis에 대해서 -6 (0) | 2025.05.29 |