본문 바로가기
데이터베이스

MySQL Buffer Pool

by 흰색남자 2023. 1. 13.

1. MySQL Buffer Pool 이란??

Innodb 스토리지 엔진에서 가장 핵심적인 부분을 담당하고 있다. 디스크의 데이터 파일이나 인덱스의 정보를 메모리에 캐싱한다. 또, 쓰기 작업을 지연시켜 일괄 배치 작업으로 처리하여 디스크에 접근하는 i/o를 최적화할 수 있다.

 

2.  Buffer Pool 크기 할당

운영체제와 각 MySQL 엔진에서 사용할 메모리도 고려하면서 설정을 해야된다. MySQL 엔진에서 크게 메모리가 사용되는 부분은 없지만, 레코드 버퍼가 상당한 메모리를 사용하기도 한다고 한다. 레코드 버퍼는 각 클라이언트 세션에서 테이블의 레코드를 읽고 쓸 때 버퍼로 사용하는 공간을 의미하고, 커넥션이 많고 사용하는 테이블도 많다면 레코드 버퍼 용도로 사용되는 메모리 공간이 필요할 수 있다. MySQL 서버가 사용하는 레코드 버퍼 공간은 별도로 설정할 수 ㅇ ㅓㅄ고, 전체 커넥션 개수와 각 커넥션에서 읽고 쓰는 테이블의 개수에 따라서 결정된다.

운영체제에서 전체 메모리가 8GB가 안된다면 50% 정도만 Innodb Buffer Pool로 설정하고 나머지 메모리는 MySQL 서버와 운영체제, 그리고 다른 프로그램이 사용할 수 있는 공간으로 사용하는 것을 권장한다.

전체 메모리가 50GB 이상이라면 15~30GB 정도를 운영체제와 다른 응용 프로그램을 위해서 남겨두고 나머지를 Innodb Buffer Pool 로 남겨두고 나머지를 Innodb Buffer Pool로 구성하자 

 

3.  Buffer Pool의 구조

Buffer Pool에서 페이지 크기 조각을 관리하기 위해 LRU(Least Recently Used) 리스트, 플러시(Flush) 리스트, 프리(Free) 리스트 3가지 자료 구조를 사용하여 관리한다.

- 프리 리스트는 Innodb Buffer Pool에서 실제 사용자 데이터로 채워지지 않은 비어 있는 페이지 록이며, 사용자의 쿼리가 새롭게 디스크의 데이터 페이지를 읽어와야 하는 경우 사용된다.

- LRU 리스트는 디스크로부터 한 번 읽어온 페이지를 최대한 오래 InnoDB Buffer Pool 메모리에 유지시켜 디스크의 읽기를 최소화 하는 것이다.

- 플러시 리스트는 디스크로 동기화되지 않은 데이터를 가진 데이터 페이지의 변경 시점 기준의 페이지 목록을 관리합니다.디스크에서 읽은 상태 그대로 전혀 변경이 없다면 플러시 리스트에서 관리되지 않지만, 한 번 데이터 변경이 가해진 데이터 페이지는 플러시 리스트에서 관리되고 특정 시점이 되면 디스크로 기록된다.

 

4. Buffer Pool 메모리 관리 알고리즘

1. 필요한 레코드가 저장된 데이터 페이지가 Buffer Pool에 있는지 검사합니다. 검사하는 과정에서는 InnoDB Adaptive hash index를 이용해 B-tree 구조의 Buffer Pool에서 페이지를 검색합니다. 만약 Buffer Pool에 데이터가 있다면 MRU로 페이지가 이동됩니다.

2. 디스크에서 필요한 데이터 페이지를 Buffer Pool에 적재하고, 적재된 페이지에 대한 포인터를 LRU 헤더에 추가합니다.

3. Buffer PoolLRU 헤더 부분에 적재된 데이터가 실제로 읽히면 MRU 헤더 부분으로 이동됩니다.

4. Buffer Pool에 상주하는 데이터 페이지는 사용자 쿼리가 얼마나 최근에 접근했었는지에 따라 age가 부여되고, Buffer Pool에 상주하는 동안 오랫동안 사용되지 않으면 데이터 페이지에 부여된 age가 오래되고 Buffer Pool에서 제거됩니다. Buffer Pool의 데이터가 사용되면 age가 초기화되어 MRU헤더 부분으로 옮겨집니다.

5. 필요한 데이터가 자주 접근됐다면 해당 페이지의 인덱스 키를  InnoDB Adaptive hash index에 추가되고, B-tree 구조를 타지 않고 바로 데이터에 접근 가능하게 됩니다.