Search

postgresql의 인덱스 유형

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 사용 추천