기본 B-tree 외에도 PostgreSQL은 여러 특수 index 타입 — GIN, GiST, BRIN, Hash — 을 제공하며, 각각 다른 데이터와 쿼리 패턴에 적합하고, 유연성을 위한 부분(partial) 및 표현식(expression) index도 있습니다. 올바른 index 타입을 선택하면 특수 쿼리의 성능을 극적으로 향상시킬 수 있습니다.
기본 B-tree 외에도 PostgreSQL은 여러 특수 index 타입 — GIN, GiST, BRIN, Hash — 을 제공하며, 각각 다른 데이터와 쿼리 패턴에 적합하고, 유연성을 위한 부분(partial) 및 표현식(expression) index도 있습니다. 올바른 index 타입을 선택하면 특수 쿼리의 성능을 극적으로 향상시킬 수 있습니다.
CREATE INDEX idx_users_email ON users(email); -- 기본 = B-tree
-- 적합: 동등(=), 범위(<, >, BETWEEN), 정렬(ORDER BY), 대부분의 쿼리
B-tree는 기본이며 대부분의 경우를 처리합니다 — 일반 컬럼의 동등, 범위, 정렬.
-- GIN (Generalized Inverted Index) — 여러 항목을 포함하는 값용
CREATE INDEX idx_attrs ON products USING GIN (attributes); -- JSONB
CREATE INDEX idx_tags ON posts USING GIN (tags); -- 배열
CREATE INDEX idx_search ON docs USING GIN (to_tsvector('english', body)); -- 전문 검색
-- 적합: JSONB 포함, 배열 멤버십, 전문 검색
GIN index는 JSONB, 배열, 전문 검색에 필수입니다 — 포함이나 멤버십을 확인하는 쿼리.
-- GiST — 기하, 범위, 최근접 이웃 (예: PostGIS, 범위 타입)
CREATE INDEX idx_geo ON places USING GiST (location);
-- BRIN (Block Range INdex) — 자연스럽게 정렬된 데이터의 대형 테이블용 작은 index
CREATE INDEX idx_time ON logs USING BRIN (created_at); -- 거대한 시계열에 좋음
-- 작은 크기, 대형 추가 전용/정렬 데이터에 효율적
-- Hash — 동등만 (=); 거의 필요 없음 (B-tree도 동등 처리)
CREATE INDEX idx_hash ON t USING HASH (col);
-- 부분(PARTIAL) index — 일부 행만 인덱싱 (더 작고 타겟팅됨)
CREATE INDEX idx_active ON users(email) WHERE active = true; -- 활성 user만
-- 표현식(EXPRESSION) index — 계산된 값 인덱싱
CREATE INDEX idx_lower_email ON users(LOWER(email)); -- 대소문자 구분 없는 조회용
SELECT * FROM users WHERE LOWER(email) = '[email protected]'; -- index 사용
부분 index(관련 행만 인덱싱 — 더 작고 빠름)와 표현식 index(계산된 값 인덱싱 — 인덱싱된 함수 기반 쿼리 가능)는 강력하고 유연한 도구입니다.
PostgreSQL의 다양한 index 타입을 이해하는 것은 성능 최적화에 가치 있는 지식입니다. 특정 데이터와 쿼리 패턴에 맞는 올바른 index 타입은 기본 B-tree가 잘 처리하지 못하거나 전혀 처리하지 못하는 쿼리를 극적으로 빠르게 만들 수 있기 때문입니다.
B-tree(기본)가 대부분의 경우(동등, 범위, 정렬)를 다루는 반면, 특수 타입은 특수 데이터의 성능을 열어줍니다. GIN은 JSONB, 배열, 전문 검색에 필수이고(포함/멤버십 쿼리 — Postgres의 강력한 JSONB와 배열 기능을 성능 있게 만듦), GiST는 기하, 범위, 최근접 이웃 쿼리(PostGIS 지리공간, 범위 타입)를 처리하며, BRIN은 대형의 자연스럽게 정렬된 테이블(시계열/추가 전용 데이터 — 전체 B-tree가 비싼 거대한 테이블에 가치 있는 선택지)에 작고 효율적인 index를 제공합니다.
어느 index 타입이 어느 시나리오에 맞는지(JSONB/배열/전문 검색에 GIN, 기하/범위에 GiST, 대형 정렬 데이터에 BRIN) 아는 것은 Postgres의 고급 기능을 최적화하는 핵심입니다.
똑같이 가치 있는 것은 부분 index(관련 행만 인덱싱 — 부분집합을 쿼리할 때 더 작고 효율적, 활성 user처럼)와 표현식 index(계산된 값 인덱싱 — 일반 index가 지원할 수 없는 대소문자 구분 없는 email 검색 같은 빠른 함수 기반 조회 가능)입니다.
index 선택이 쿼리 성능에 상당한 영향을 미치고, Postgres의 특수 index 타입(특히 JSONB/배열/전문 검색용 GIN)이 고급 데이터 타입을 성능 있게 만들므로, index 타입과 각각 언제 사용할지 — 부분 및 표현식 index 포함 — 이해하는 것은 PostgreSQL 데이터베이스를 최적화하는 가치 있고 자주 관련되는 지식이며, 다양한 쿼리 패턴에 Postgres를 빠르게 만들 수 있는 개발자를 구별하고 데이터베이스의 전체 성능 능력을 활용하는 핵심 측면입니다.