개발 · Essay №011
PostgreSQL vs MySQL 인덱싱 비교
인덱스 타입, 부분 인덱스, Full Text Search, JSON 인덱싱 차이
이종관2025년 1월 14일5 min read
Contents
데이터베이스 인덱스는 테이블 전체를 스캔하지 않고 원하는 행을 빠르게 찾기 위한 자료구조이다. PostgreSQL과 MySQL은 지원하는 인덱스 타입과 내부 구현이 다르며, 이 차이가 쿼리 성능과 활용 전략에 직접 영향을 준다.
지원 인덱스 타입 비교
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
일부 데이터만 인덱싱하여 디스크 사용량과 유지 비용 절감:
sql
-- status='ACTIVE'인 행만 인덱스
CREATE INDEX idx_active_users ON users(email)
WHERE status = 'ACTIVE';PostgreSQL Expression Index
함수나 표현식 결과를 기반으로 인덱스 생성:
sql
-- 대소문자 구분 없이 검색
CREATE INDEX idx_lower_name ON users((LOWER(name)));
-- JSON 특정 키만 인덱싱
CREATE INDEX idx_json_email ON users((data->>'email'));MySQL의 한계
- 부분 인덱스: 조건 기반 부분 인덱스 미지원 (접두사 인덱스만 가능)
- 표현식 인덱스: 8.0.13+ 제한적 지원
sql
-- 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 인덱싱:
sql
-- Full Text Search
CREATE INDEX idx_fts ON articles USING GIN(to_tsvector('english', content));
-- JSONB 인덱싱
CREATE INDEX idx_jsonb ON users USING GIN(metadata jsonb_path_ops);- 언어별 토큰화·불용어 처리 내장
- 한국어 검색은 기본 설정만으로 충분하지 않아 별도 형태소 분석 확장이나 사용자 정의 설정 필요
- JSONB 전체 구조 역색인화 가능
MySQL
sql
-- 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
sql
-- 서비스 중단 없이 인덱스 생성
CREATE INDEX CONCURRENTLY idx_name ON users(name);
-- 인덱스 재구성
REINDEX INDEX idx_name;MySQL
sql
-- 온라인 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와 인덱스 전략을 선택하자.