Haneul's Blog

[DB] InnoDB 버퍼 풀 본문

DB

[DB] InnoDB 버퍼 풀

haneulss 2022. 11. 1. 21:36

InnoDB 버퍼 풀이란?

InnoDB 버퍼 풀은 InnoDB 스토리지 엔진에서 가장 중요한 부분으로 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해두는 공간입니다. 데이터를 변경하는 쿼리는 데이터 파일 곳곳의 레코드를 변경하기 때문에 랜덤한 디스크 작업을 발생시키지만 버퍼 풀이 이러한 변경된 데이터를 모아서 처리하여 랜덤한 디스크 작업을 줄여주는 역할, 즉 쓰기 지연을 해줍니다.

 

또한 버퍼 풀은 대량 읽기 조작의 효율성을 위해 여러 행을 보유할 수 있는 페이지로 분할되며 캐리 관리 효율성을 위해링크된 페이지 목록으로 구현됩니다. 거의 사용되지 않는 데이터는 LRU 알고리즘을 사용하여 캐시에서 제거합니다.

이러한 버퍼 풀을 통해 데이터를 메모리에 유지하는 것은 MySQL 튜닝에서 핵심적인 측면입니다.

 

LRU 알고리즘이란?

MySQL의 캐시 전략은 변형된 LRU알고리즘을 사용하며 가장 오랫동안 참조되지 않은 페이지를 제거합니다.

변형된 LRU 알고리즘

단순한 LRU 알고리즘

단순한 LRU 알고리즘은 Head에는 가장 최근 데이터가 Tail에는 가장 오래된 데이터가 존재합니다. 이후에 버퍼가 가득 찼을 경우에 Tail에 있는 데이터를 버퍼 풀에서 제거합니다.

 

변형된 LRU 알고리즘

MySQL에서 사용되는 변형된 LRU 알고리즘은 버퍼 풀 리스트가 New, Old 서브 리스트로 나뉘며 각각 Head, Tail이 존재합니다. 그리고 New, Old 서브 리스트는 각각 5/8, 3/8 비율로 구성되고 New의 Tail과 Old의 Head가 만나는 지점을 MidPoint라고 하며 이후 버퍼 풀에 새로운 페이지가 들어올 경우에 중간 지점인 Old Head 부분에 저장됩니다.

 

왜 새로운 데이터가 New의 Head가 아닌 Old의 Head에 들어가는 것일까요?

단순한 LRU 구조의 경우에는 사용자에 의해 Dump, Where 절 없는 Select 등 일회성의 데이터를 가져올 경우 자주 사용되던 페이지가 제거될 여지가 있습니다. 이러한 문제를 해결하기 위해 MySQL은 MidPoint 삽입 전략을 사용합니다.
이는 새로운 페이지가 버퍼 풀에 들어왔을 경우 우선 Old의 Head로 이동하게 되며 사용되지 않을 겨우 빠르게 버퍼 풀에서 제거됩니다. 만약 해당 페이지가 다시 한 번 참조될 경우 New의 Head로 이동시켜 보관되게 됩니다. 이러한 구조로 자주 사용되는 페이지가 캐시의 New에 오랫동안 남을 수 있어 성능을 유지할 수 있게 되는 것입니다.

 

버퍼 풀의 크기 설정

innodb_buffer_pool_size
-> 보통 메모리의 7~80퍼이지만 간단하게 설정할 것이 아닌 운영체제와 각 클라이언트 스레드가 사용할 메모리도 충분히 고려하여 설정해야 합니다.

 

DB에서는 버퍼 풀의 크기가 클수로 성능에 유리합니다. 그 이유는 조회 처리를 위한 캐시 효과 덕분이며 즉, 버퍼 풀에 이미 데이터가 올라와 있어서 Disk I/O 작업을 발생시키지 않고 바로 데이터에 접근할 수 있기 때문입니다.

 

만약에 인덱스가 잘 설계 되어 있는 경우에도 슬로우 쿼리가 많이 발생하는 경우가 있다면 innodb_buffer_pool_size의 값을 확인해봐야 합니다. 해당 값이 클수록 쿼리 실행 시 디스크보다 메모리를 사용하게 되어 빠른 결과를 얻을 수 있습니다. 버퍼 풀이 충분히 큰 양으로 할당되어 있다면 InnoDB는 in-memory 데이터베이스처럼 동작합니다.

 

슬로우 쿼리란?

DB가 클라이언트의 요청을 받아 응답하는 과정ㅇ에서 오래 걸리는 쿼리를 지칭합니다.

 

버퍼 풀 인스턴스 수

innodb_buffer_pool_instances
→ core 수 * 2

 

MySQL에서는 버퍼 풀의 인스턴스 수를 설정할 수 있습니다. 인스턴스 수를 늘리게 되면 트랜잭션 간의 Lock 경합을 줄일 수 있고 스레드가 동시에 버퍼 풀에 접근하더라도 Lock 경합을 피할 수 있습니다.
CPU 코어가 많은 시스템일수록 인스턴스 수를 늘릴 수 있으며 기본 값은 8입니다.

 

참고 자료

https://omty.tistory.com/58

 

[MySQL] Innodb Buffer Pool 구조 및 캐시 전략

개요 MySQL은 빠른 성능을 위해 메모리 영역의 Buffer Pool을 사용합니다. 해당 영역의 구조 및 동작 방식에 대해 알아보도록 하겠습니다. Buffer Pool이란 Innodb 엔진에서 테이블이나 인덱스 데이터를

omty.tistory.com

https://owlyr.tistory.com/23

 

[MySQL] 성능 튜닝 - 버퍼 풀

버퍼 풀(Buffer Pool) 버퍼 풀의 크기 (innodb_buffer_pool_size) 버퍼 풀 인스턴스 수 (innodb_buffer_pool_instances) ⍞ Reference 버퍼 풀(Buffer Pool) 버퍼 풀은 InnoDB가 액세스 할 때 테이블 및 인덱스 데이터를 캐시하

owlyr.tistory.com

 

'DB' 카테고리의 다른 글

[DB] SELECT 쿼리 문법 및 실행 순서  (0) 2022.11.04
[DB] InnoDB 어댑티브 해시 인덱스  (0) 2022.11.02
[DB] MySQL 메모리 할당 및 사용 구조  (0) 2022.10.28
[DB] WAL(Write-Ahead-Logging)  (0) 2022.10.15
[DB] MySQL의 실행 구조  (0) 2022.10.14