B 트리와 B+ 트리 (B-Tree & B+ Tree)

한눈에 보기

한 노드에 여러 키를 담아 높이를 낮춘 B 트리와 리프에 데이터를 모아 연결한 B+ 트리를 다룬다. 디스크 I/O 최소화 원리와 데이터베이스 인덱스가 B+ 트리를 쓰는 이유를 정리했다.

최종 업데이트 2026.09.17

B 트리(B-Tree)는 한 노드에 여러 개의 키와 자식을 담아 트리의 높이를 극단적으로 낮춘 균형 다진 탐색 트리이고, B+ 트리(B+ Tree)는 모든 데이터를 리프(leaf)에 모으고 리프끼리 연결 리스트로 이은 그 변형이다. 두 구조는 디스크처럼 블록 단위로 읽는 저장 장치에서 접근 횟수를 최소화하도록 설계되어, 관계형 데이터베이스의 인덱스(index)와 파일 시스템의 표준 자료구조로 쓰인다. 특히 B+ 트리는 범위 검색에 강해 MySQL의 InnoDB를 비롯한 대부분의 데이터베이스 인덱스가 채택하고 있다.

왜 이진 트리로는 부족한가

메모리 위에서는 레드 블랙 트리(Red-Black Tree) 같은 이진 탐색 트리로 충분하다. 그러나 디스크는 다르다. 디스크와 SSD는 데이터를 페이지(page)라는 블록 단위(보통 수 킬로바이트)로 읽어오며, 한 번의 입출력(I/O) 비용이 메모리 접근보다 압도적으로 크다. 이진 트리는 노드 하나에 키가 하나뿐이라 노드를 옮길 때마다 I/O가 발생할 수 있고, 데이터 백만 건이면 높이가 20에 달해 탐색 한 번에 디스크를 스무 번 읽어야 할 수도 있다.

B 트리의 발상은 단순하다. 한 번 읽어 온 페이지를 최대한 활용하도록, 노드 하나를 페이지 크기에 맞추고 그 안에 키를 수백 개씩 담는 것이다. 자식이 수백 갈래로 갈라지면 백만 건도 높이 3에서 4 안에 들어오고, 디스크 접근이 그만큼으로 줄어든다.

B 트리의 구조와 동작

차수 m의 B 트리에서 각 노드는 최대 m-1개의 키와 m개의 자식을 갖고, 루트를 제외한 노드는 최소 절반가량 차 있어야 한다. 노드 안의 키는 정렬되어 있으며, 키 사이사이의 자식 포인터가 해당 구간의 값들을 담은 부분 트리를 가리킨다. 모든 리프는 같은 깊이에 있어 트리가 항상 완전한 균형을 이룬다.

삽입은 리프에서 이루어지며, 노드가 가득 차면 가운데 키를 부모로 올려보내고 노드를 둘로 쪼갠다(분할, split). 분할이 루트까지 전파되면 트리 높이가 1 늘어난다. 삭제 시 노드가 최소 키 수 아래로 떨어지면 형제에게서 키를 빌리거나(재분배) 형제와 합친다(병합, merge). 이 규칙 덕분에 트리는 스스로 균형을 유지하고 모든 연산이 O(log n)으로 보장된다.

B+ 트리의 개선점

B+ 트리는 B 트리에 두 가지 변화를 더한다. 첫째, 실제 데이터(레코드 포인터 포함)는 전부 리프에만 저장하고, 내부 노드는 길 안내용 키만 갖는다. 둘째, 리프들을 순서대로 연결 리스트로 잇는다.

B 트리와 B+ 트리 차이: B 트리는 모든 노드에 키와 데이터가 있고, B+ 트리는 내부 노드에 키만 두고 데이터는 리프에 모아 연결 리스트로 잇는 구조
그림에서 오른쪽 내부 노드에 ●가 없는 것이 핵심이다. 데이터가 없으니 내부 노드 한 페이지에 키를 더 많이 담을 수 있고, 그만큼 트리 높이가 낮아져 디스크 I/O가 줄어든다. 리프를 잇는 화살표는 범위 검색을 «한 번 내려가서 옆으로 읽기»로 만든다.

이 구조가 주는 이점은 뚜렷하다. 내부 노드가 데이터를 안 가지니 같은 페이지에 더 많은 키가 들어가 분기 수가 커지고 트리가 더 낮아진다. 범위 검색은 시작 키를 찾은 뒤 리프 연결 리스트를 따라가기만 하면 되므로 트리를 오르내릴 필요가 없다. 데이터베이스에서 BETWEEN 조건이나 ORDER BY 정렬 스캔이 효율적인 이유가 바로 이것이다. 또한 모든 탐색이 반드시 리프까지 내려가므로 탐색 시간이 균일하다. 대신 B 트리에서는 운 좋게 내부 노드에서 탐색이 끝날 수 있고, 키가 내부와 리프에 중복 저장되지 않는다는 점은 B 트리의 장점이다.

구분B 트리B+ 트리
데이터 위치모든 노드리프에만
내부 노드 역할키와 데이터 저장길 안내용 키만 저장
리프 연결없음연결 리스트로 순차 연결
범위 검색중위 순회 필요리프 순차 스캔으로 매우 빠름
탐색 종료 지점내부 노드에서 끝날 수 있음항상 리프까지 내려감
대표 사용처일부 파일 시스템대부분의 DB 인덱스(InnoDB 등)

시간 복잡도와 실무 의미

탐색, 삽입, 삭제 모두 O(log n)이며, 밑이 분기 수 m인 로그이므로 실제 높이는 매우 낮다. 페이지 크기 16KB인 InnoDB 기준으로 인덱스 높이는 수억 건에서도 보통 3에서 4 수준이고, 이는 조회 한 번에 디스크 I/O가 서너 번이면 충분하다는 뜻이다. 해시 인덱스가 등호 조회에서 평균 O(1)로 더 빠름에도 데이터베이스 기본 인덱스가 B+ 트리인 이유는, 해시가 범위 검색과 정렬을 전혀 지원하지 못하기 때문이다. 면접에서 "인덱스는 왜 B+ 트리인가"라는 질문은 결국 디스크 I/O 최소화와 범위 검색이라는 두 키워드로 답하면 된다.

면접에서 이렇게 물어본다

  • 데이터베이스 인덱스가 레드 블랙 트리가 아니라 B+ 트리를 쓰는 이유를 디스크 I/O 관점에서 설명해 보라.
  • B 트리와 B+ 트리의 구조적 차이와 각각의 장단점을 비교해 보라.
  • B 트리에서 노드가 가득 찼을 때 삽입이 어떻게 처리되는지 설명해 보라.
  • B+ 트리가 범위 검색에 유리한 이유를 리프 구조와 연결해 설명해 보라.
  • 해시 인덱스와 B+ 트리 인덱스의 선택 기준을 설명해 보라.
자료구조 문서 전체 보기

이 개념, 내 코드에서는 어떻게 물어볼까요

데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.

공고 넣고 시작하기