효율적인 범위 검색 (Range Scan)
WHERE age > 20)를 찾으려면 트리 전체를 중위 순회(In-order-traversal)하며 위아래로 계속 이동해야 한다.더 많은 키 저장 가능 (I/O 효율성)
캐시 히트율 상승
CREATE TABLE users (
user_id INT PRIMARY KEY, -- 클러스터형 인덱스 (B+Tree)
name VARCHAR(20),
age INT
);
10, 15, 20, 25, 30, 35, 40 (총 7개의 레코드)[ Root Node (Level 0) ]
[ 25 | ] <-- 25를 기준으로 길을 나눔
/ \
/ \
[ Internal Node (Level 1) ] [ Internal Node (Level 1) ]
[ 15 | 20 ] [ 35 | 40 ]
/ | \ / | \
/ | \ / | \
[Leaf] [Leaf] [Leaf] <--- 연결 리스트 ---> [Leaf] [Leaf] [Leaf] (Level 2)
| | | | | |
[10] [15] [20] [25] [30] [35] [40]
Record Record Record Record Record Record Record
user_id = 22를 찾는다면,
user_id뿐만 아니라 해당 행의 **모든 데이터(name, age등)**가 함꼐 저장된다.WHERE user_id BETWEEN 15 AND 35라는 쿼리가 들어오면, 트리 타고 15를 찾은 뒤25에도 name, age 데이터가 붙어 있었을 것이다.B+Tree는 정렬 상태를 유지해야 하며, 각 노드(Page)의 용량은 제한적이다.
(MySQL은 기본 16KB)
삭제는 삽입의 반대 과정
트리의 높이
BIGINT(8바이트)라면, 페이지 주소값 등을 포함해도 한 페이지에 약 1,000개 이상의 자식 노드 주소를 저장할 수 있다.페이지 분할(Page Split)의 기준
INSERT하다가 해당 페이지의 여유 공간이 16KB를 넘어서려고 하면, 데이터베이스는 페이지를 두 개(8KB, 8KB)로 나눈다
단편화(Fragmentation)
OPTIMIZE TABLE로 페이지를 재정렬할 수 있다.