TIL

4.2.7 InnoDB 버퍼 풀

버퍼 풀 크기 설정

버퍼 풀의 구조

버퍼 풀은 페이지 크기 조각을 관리하기 위해 다음의 세 자료구조를 관리한다.

버퍼 풀과 리두 로그

InnoDB 버퍼 풀은 캐시 역할과 쓰기 버퍼링의 역할을 갖고 있다. 버퍼 풀 크기를 늘리면 성능이 빨라지는데 이는 캐시 기능만 향상 시키는 것이다. 버퍼 풀의 쓰기 버퍼링까지 향상 시키려면 버퍼 풀과 리두 로그의 관계를 이해할 필요가 있다. img.png

버퍼 풀 플러시

InnoDB 스토리지 엔진은 주기적으로 플러시 리스트 플러시 함수를 호출해 플러시 리스트에서 변경된 데이터 페이지를 순서대로 디스크에 동기화하는 작업을 수행한다. 이 때 언제부터 얼마나 많은 페이지를 한 번에 기록하느냐에 따라 사용자 쿼리 처리에 영향을 줄 수도 안 줄 수도 있다.

이를 위해InnoDB 스토리지 엔진은 다음의 시스템 변수들을 제공한다.

LRU 리스트 플러시

LRU 리스트에서 사용 빈도가 낮은 데이터 페이지를 제거해 새로운 페이지를 읽을 공간을 만들 때 LRU 리스트 플러시 함수를 사용한다.

버퍼 풀 상태 백업 및 복구

MySQL 서버를 껐다가 다시 시작하면 InnoDB 버퍼 풀에 데이터가 없는 상태이므로 쿼리 성능이 평소보다 훨씬 나쁠 수도 있다. 반대로 디스크의 데이터가 버퍼 풀에 적재돼 있는 상태를 워밍업(Warming Up)이라고 표현하는 데 잘 워밍업된 상태에서 몇십 배의 쿼리 성능 향상이 일어나기도 한다.

MySQL 5.6부터는 버퍼 풀 덤프 및 적재 기능이 도입됐다.

버퍼 풀의 적재 내용 확인

4.2.8 Double Write Buffer

InnoDB 스토리지 엔진의 리두 로그는 페이지의 변경된 내용만 기록하기 때문에 더티 페이지를 플러시할 때 일부만 기록된다면 그 페이지의 내용은 복구할 수 없다.

InnoDB에선 이 같은 문제를 막기 위해 Double-Write 기법을 이용한다.