B-Tree (Balanced Tree)
•
설명: 가장 일반적인 인덱스 유형으로, 정렬된 데이터를 저장
•
사용 시기: 동등 비교 (=), 범위 검색 (<, <=, >, >=), BETWEEN, IN, IS NULL, IS NOT NULL, 패턴 매칭 (LIKE 'abc%' - 앞부분 일치)
•
적합한 데이터: 숫자, 텍스트, 날짜 등 순서가 있는 데이터
Hash
•
설명: 해시 테이블을 사용하여 데이터를 저장
•
사용 시기: 동등 비교 (=) 연산만 필요할 때
•
적합한 데이터: 고유한 값이 많은 컬럼
GiST (Generalized Search Tree)
•
설명: 다양한 데이터 타입과 검색 방법을 지원하는 범용 인덱스
•
사용 시기:
•
지리 데이터 검색
•
기하학적 데이터 연산
•
최근접 이웃 검색
•
적합한 데이터:
•
지리 데이터 (PostGIS)
•
기하학적 데이터
•
사용자 정의 데이터 타입
SP-GiST (Space-Partitioned GiST)
•
설명: 공간을 분할하여 데이터를 저장하는 비균형 자료구조
•
사용 시기:
•
자연스럽게 클러스터된 데이터 검색
•
비균등한 데이터 분포
•
적합한 데이터:
•
IP 주소
•
전화번호
•
공간 데이터
GIN (Generalized Inverted Index)
•
설명: 복합 값(배열, JSON 등)을 처리하는 역인덱스
•
사용 시기:
•
배열 검색
•
전문 검색
•
JSON 데이터 검색
•
적합한 데이터:
•
배열
•
JSON
•
tsvector (전문 검색)
BRIN (Block Range INdex)
•
설명: 데이터 블록의 범위 정보를 저장하는 작은 크기의 인덱스
•
사용 시기:
•
대용량 테이블에서 순차적으로 저장된 데이터 검색
•
디스크 공간 절약이 필요할 때
•
적합한 데이터:
•
타임스탬프
•
순차적 ID
•
센서 데이터
인덱스 생성방법
-- B-Tree (기본)
CREATE INDEX idx_user_email ON users(email);
-- Hash
CREATE INDEX idx_user_id_hash ON users USING HASH (id);
-- GiST (지리 데이터)
CREATE INDEX idx_location_gist ON locations USING GIST (coordinates);
-- SP-GiST (IP 주소)
CREATE INDEX idx_ip_spgist ON network USING SPGIST (ip_address);
-- GIN (JSON)
CREATE INDEX idx_data_gin ON documents USING GIN (data jsonb_path_ops);
-- BRIN (타임스탬프)
CREATE INDEX idx_time_brin ON logs USING BRIN (created_at);
SQL
복사
동등비교일 때 hash가 b-tree보다 효율적인가?
이론적인 성능 비교
•
Hash 인덱스: O(1) - 상수 시간
•
B-tree 인덱스: O(log n) - 로그 시간
실제 성능 차이
일반적인 상황
Hash가 B-tree보다 약 20-30% 정도 빠를 수 있음
하지만 이는 이상적인 조건에서의 이야기
실제 환경에서 고려할 점
메모리 사용량: Hash 인덱스가 더 많은 메모리 사용
인덱스 크기: Hash 인덱스가 일반적으로 더 큼
데이터 분포: 데이터 충돌이 많으면 Hash 성능 저하
결론
•
Hash 인덱스의 이점이 제한적이어서 PostgreSQL에서는 B-tree를 기본으로 사용
•
실제로는 B-tree가 더 범용적이고 안정적이라 권장됨
•
Hash 인덱스의 성능상 이점이 크지 않아 특별한 경우가 아니면 B-tree 사용 추천