에듀테크 프로젝트 대시보드
인덱스 종류
B-tree 가 기본이자 대부분의 정답이지만, 데이터 형태에 따라 특수 인덱스가 훨씬 낫습니다.
| 종류 | 쓰는 곳 |
|---|---|
| B-tree (기본) | 등호·부등호·범위·정렬·LIKE 'prefix%' |
| GIN | jsonb, 배열, 전문검색 tsvector — '한 행에 값이 여러 개' |
| GiST | 범위 타입, 기하/위치, 최근접 검색(KNN), 제외 제약 |
| BRIN | 아주 큰 append-only 테이블 + 물리적으로 정렬된 컬럼(시간 등) |
| Hash | 등호 전용. 거의 B-tree 로 충분해서 잘 안 씀 |
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)로 쓰기를 버퍼링합니다.
-- 10억 행 로그, created_at 순으로 적재됨
CREATE INDEX ON logs USING brin (created_at) WITH (pages_per_range = 32);블록 범위별 최소/최대만 저장 → 인덱스 크기가 B-tree 의 수천분의 1. 대신 정밀도가 낮아 물리적 정렬이 안 된 컬럼엔 무의미.
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 · 자연어 검색 → 전문 검색