한양과학기술고등학교

에듀테크 프로젝트 대시보드

인덱스 종류

btree GIN GiST BRIN hash pg_trgm

B-tree 가 기본이자 대부분의 정답이지만, 데이터 형태에 따라 특수 인덱스가 훨씬 낫습니다.

1. 한눈에

종류쓰는 곳
B-tree (기본)등호·부등호·범위·정렬·LIKE 'prefix%'
GINjsonb, 배열, 전문검색 tsvector — '한 행에 값이 여러 개'
GiST범위 타입, 기하/위치, 최근접 검색(KNN), 제외 제약
BRIN아주 큰 append-only 테이블 + 물리적으로 정렬된 컬럼(시간 등)
Hash등호 전용. 거의 B-tree 로 충분해서 잘 안 씀

2. GIN — jsonb / 배열

CREATE INDEX ON docs USING gin (payload);                 -- @>, ?, ?| 지원
CREATE INDEX ON docs USING gin (payload jsonb_path_ops);  -- @> 전용, 더 작음
CREATE INDEX ON posts USING gin (tags);                   -- text[]

GIN 은 조회가 빠른 대신 쓰기가 무겁습니다. fastupdate(기본 on)로 쓰기를 버퍼링합니다.

3. BRIN — 시계열 대용량

-- 10억 행 로그, created_at 순으로 적재됨
CREATE INDEX ON logs USING brin (created_at) WITH (pages_per_range = 32);

블록 범위별 최소/최대만 저장 → 인덱스 크기가 B-tree 의 수천분의 1. 대신 정밀도가 낮아 물리적 정렬이 안 된 컬럼엔 무의미.

4. 부분 문자열 검색 — pg_trgm

CREATE EXTENSION IF NOT EXISTS pg_trgm;
CREATE INDEX idx_students_name_trgm ON students USING gin (name gin_trgm_ops);

SELECT * FROM students WHERE name ILIKE '%한양%';   -- 이제 인덱스 사용
정리
  • LIKE 'abc%' → B-tree · LIKE '%abc%' → pg_trgm GIN · 자연어 검색 → 전문 검색
"timestamptz 를 써라. 거의 항상."