PostgreSQL vs MySQL 인덱싱 비교
인덱스 타입, 부분 인덱스, Full Text Search, JSON 인덱싱 차이
2025년 1월 14일·4 min read·
data
postgresql
mysql
database
indexing
performance
지원 인덱스 타입 비교
PostgreSQL
| 인덱스 | 용도 |
|---|---|
| B-Tree | 기본 인덱스, 비교 연산 최적화 |
| Hash | 동등 연산(=) 빠른 비교 |
| GIN | Full Text Search, JSONB, 배열 검색 |
| GiST | 지리 정보(PostGIS), 범위 타입 |
| BRIN | 대용량 시계열/순차 데이터 |
| SP-GiST | 트라이 기반 공간 분할 |
MySQL (InnoDB)
| 인덱스 | 용도 |
|---|---|
| B-Tree | 기본 인덱스, 대부분의 경우 |
| Hash | Adaptive Hash Index (내부 최적화용) |
| FULLTEXT | 텍스트 검색 |
| R-Tree | GIS 기능 (8.0+) |
부분 인덱스 & 표현식 인덱스
PostgreSQL - Partial Index
일부 데이터만 인덱싱하여 디스크 사용량과 유지 비용 절감:
-- status='ACTIVE'인 행만 인덱스
CREATE INDEX idx_active_users ON users(email)
WHERE status = 'ACTIVE';
PostgreSQL - Expression Index
함수나 표현식 결과를 기반으로 인덱스 생성:
-- 대소문자 구분 없이 검색
CREATE INDEX idx_lower_name ON users((LOWER(name)));
-- JSON 특정 키만 인덱싱
CREATE INDEX idx_json_email ON users((data->>'email'));
MySQL의 한계
- 부분 인덱스: 조건 기반 부분 인덱스 미지원 (접두사 인덱스만 가능)
- 표현식 인덱스: 8.0.13+ 제한적 지원
-- MySQL 접두사 인덱스
CREATE INDEX idx_name ON users(name(10));
-- MySQL 8.0+ 함수 기반 인덱스
CREATE INDEX idx_lower ON users((LOWER(name)));
Full Text Search & JSON 인덱싱
PostgreSQL
GIN 인덱스로 고급 텍스트 검색과 JSONB 인덱싱:
-- Full Text Search
CREATE INDEX idx_fts ON articles USING GIN(to_tsvector('korean', content));
-- JSONB 인덱싱
CREATE INDEX idx_jsonb ON users USING GIN(metadata jsonb_path_ops);
- 다양한 언어별 토큰화, 불용어 처리
- JSONB 전체 구조 역색인화 가능
MySQL
-- FULLTEXT 인덱스
CREATE FULLTEXT INDEX idx_content ON articles(content);
-- JSON 경로 인덱스 (8.0+)
CREATE INDEX idx_json ON users((CAST(data->>'$.email' AS CHAR(255))));
- 자연어 검색, Boolean 모드 지원
- JSON 전체 구조 인덱싱은 제한적
동시성 및 인덱스 관리
PostgreSQL
-- 서비스 중단 없이 인덱스 생성
CREATE INDEX CONCURRENTLY idx_name ON users(name);
-- 인덱스 재구성
REINDEX INDEX idx_name;
MySQL
-- 온라인 DDL (일부 작업 제한)
ALTER TABLE users ADD INDEX idx_name(name), ALGORITHM=INPLACE, LOCK=NONE;
성능 최적화 포인트
| 항목 | PostgreSQL | MySQL |
|---|---|---|
| B-Tree | 기본 지원 | 기본 지원 |
| 부분 인덱스 | 조건 기반 가능 | 미지원 |
| 표현식 인덱스 | 자유로움 | 8.0+ 제한적 |
| 텍스트 검색 | GIN + 고급 기능 | FULLTEXT 기본 |
| JSON | GIN 역색인 | 경로 기반 제한적 |
정리
PostgreSQL은 인덱싱 기능이 매우 다양하고 복잡한 시나리오에 대응하기 좋습니다.
MySQL은 일반적인 B-Tree 인덱스로 범위/동등 조건 쿼리를 빠르게 처리하지만, 고급 인덱스 기법에서는 제약이 있습니다.
데이터 특성과 쿼리 패턴에 따라 적절한 DBMS와 인덱스 전략을 선택하세요.