- 인덱스와 실행 계획은 DB 성능의 80%를 결정짓는 핵심 분야 - 인덱스의 가장 기본이 되는 B+Tree 구조부터 시작해보자. - B+Tree는 이진 트리(Binary Tree)를 확장하여 하다의 노드가 가질 수 있는 자식 노드의 개수를 늘린 B-Tree의 변형 구조이다 - 핵심 특징: - 모든 키 값은 Leaf Node에만 존재: - Root와 Int...
효율적인 범위 검색(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 Recorduser_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로 페이지를 재정렬할 수 있다.