inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

김영한의 실전 데이터베이스 - 성능 최적화, 실행 계획과 인덱스 완전 정복

B+Tree 내부 구조 1

컬럼 크기가 대용량인 경우 DB 버퍼 풀에 전부 올라오는지 궁금합니다

63

ggg7515

작성한 질문수 10

0

컬럼의 크기가 평균 1MB 정도 된다고 했을 때DB 버퍼 풀에 전부 올라오고 나서 서비스 서버로 올라가게 되는지 궁금 합니다 !


서비스 서버 단에서 스트림으로 처리 한다고 해서 DB 메모리 공간도 같이 효율적으로 사용 되는지도 궁금 합니다 !

sql mysql dbms/rdbms sql-tuning SQLD

답변 2

1

김영한

안녕하세요. ggg7515님

결론부터 말씀드리면, 해당 컬럼 값 전체가 버퍼 풀을 거쳐서 올라옵니다.

InnoDB는 데이터를 항상 페이지(기본 16KB) 단위로 읽고 씁니다. 그런데 1MB 정도의 큰 컬럼 값은 하나의 페이지에 담을 수 없기 때문에, InnoDB는 이런 값을 별도의 외부 페이지(overflow page)에 나누어 저장하고, 원래 레코드에는 그 위치를 가리키는 포인터만 남겨둡니다.

따라서 이 컬럼을 조회하면 InnoDB는 포인터를 따라가며 1MB를 담고 있는 약 64개의 외부 페이지를 모두 읽어야 하는데, InnoDB의 모든 페이지 읽기는 반드시 버퍼 풀을 통해서만 일어납니다. 대용량 값이라고 해서 버퍼 풀을 우회하는 별도 경로는 없습니다. 값 전체가 버퍼 풀에 올라온 뒤에 MySQL 서버가 이를 조합해서 클라이언트로 전송합니다.

두 번째 질문도 중요한 포인트인데요, 애플리케이션에서의 스트림 처리는 결과를 행 단위로 받아서 애플리케이션 서버의 메모리를 아끼는 기술입니다. 하지만 DB 입장에서는 어차피 각 행을 만들기 위해 해당 컬럼 전체를 버퍼 풀에 읽어야 하므로, 클라이언트가 스트림으로 받는다고 해서 DB의 메모리 사용이 줄어들지는 않습니다. 오히려 스트림 방식은 커넥션을 더 오래 점유하는 비용도 있습니다.

추가로 실무 관점을 말씀드리면, 이런 대용량 컬럼은 버퍼 풀을 빠르게 채워서 정작 자주 쓰는 인덱스와 데이터 페이지를 밀어낼 수 있습니다. 그래서 실무에서는 보통 다음과 같이 설계합니다. 첫째, 대용량 컬럼은 꼭 필요한 경우에만 SELECT 합니다(SELECT *를 피하고 컬럼을 명시). 둘째, 일부만 필요하면 SUBSTRING으로 나누어 읽는 방법도 있습니다. 셋째, 1MB급 데이터라면 파일 스토리지(S3 등)에 저장하고 DB에는 메타데이터와 경로만 보관하는 설계를 가장 많이 사용합니다.

감사합니다.

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.
ggg7515님, 데이터베이스 버퍼 풀에 대해서 질문해주셨군요.

버퍼 풀은 데이터베이스에서 디스크 I/O를 줄이고 성능을 향상시키기 위한 메모리 공간입니다. 일반적으로 버퍼 풀은 자주 사용되는 데이터 및 인덱스를 메모리에 적재하여 빠르게 접근할 수 있도록 돕습니다. 하지만, 모든 데이터를 버퍼 풀에 올리는 것은 현실적으로 한계가 있습니다.

특히, 컬럼의 크기가 평균 1MB 정도로 대용량일 경우, 전체 데이터를 버퍼 풀에 적재하는 것은 어려울 수 있습니다. 이는 버퍼 풀의 크기와 설정에 따라 다르겠지만, 버퍼 풀은 보통 자주 접근하는 작은 데이터 블록을 캐싱하는데 최적화되어 있으며, 대용량 컬럼을 모두 메모리에 적재하는 것은 비효율적일 수 있습니다.

스트리밍 처리는 이러한 제한점을 해결하는 방법 중 하나입니다. 스트리밍 처리를 통해 데이터의 일부만 메모리에 올리고 필요한 부분만을 네트워크를 통해 처리할 수 있어, 메모리와 네트워크 자원을 좀 더 효율적으로 사용할 수 있습니다.

또한, 데이터베이스에서 대용량 데이터를 처리할 때는 데이터베이스 설계 및 구성, 인덱싱 전략의 최적화가 중요합니다. 효율적인 데이터 처리 및 성능 최적화를 위해 다양한 접근을 고려해 보시는 것을 추천드립니다.

추가적인 도움이 필요하시다면, 참고 링크도 함께 제공해드리겠습니다:
- Kafka Documentation - Hardware and OS

감사합니다.

ArticleReadService 관련 질문

0

9

0

마스터패스...

0

13

1

kafka 이벤트 발행 실패 시 at-least-once를 보장하는 방법이 궁금합니다.

1

30

1

[과제] 연습문제 쿼리 작성했습니다!

0

8

1

SubStack 신청 완료했습니다!

0

12

2

domain에 @Entity 와 Repository를 함께 둔 이유가 궁금합니다

1

22

1

실습소 페이지

0

18

2

노드

0

16

1

57번

0

27

1

안녕하세요. 요약집 어디서 볼 수 있을까요?

0

27

1

아무도 모르게 책 내시면 모르실 줄 알고!!

1

42

2

Jib 이미지 빌드에서 docker credential 관련으로 이슈가 있다면

1

57

1

스크립트에 대해 질문 있습니다.

1

51

1

64비트 다운로드 링크

0

26

2

같은 사용자가 연속된 중복 호출할 경우 어떻게 되는지 궁금합니다!

2

55

1

리뷰

0

37

2

조건 검색 질문

0

31

1

이진 트리 노드

0

43

1

통계정보 갱신 질문

0

62

2

PK 관련하여 궁금한 점이 있어서 질문 드립니다.

0

68

2

탐색을 한번 더 하지 않게 하는 방식 중 어댑티브 해시 방식도 맞는지 궁금 합니다.

0

71

2

실습데이터 ORDERS 생성 시간 질문요...

0

94

3

MySQL 서버구조 쿼리파서 질문 있습니다 !

0

67

1

Postgresql 아키텍처 업데이트

1

85

2