jongkwan.dev
개발 · Essay №011

PostgreSQL vs MySQL 인덱싱 비교

인덱스 타입, 부분 인덱스, Full Text Search, JSON 인덱싱 차이

이종관2025년 1월 14일5 min read
Contents

데이터베이스 인덱스는 테이블 전체를 스캔하지 않고 원하는 행을 빠르게 찾기 위한 자료구조이다. PostgreSQL과 MySQL은 지원하는 인덱스 타입과 내부 구현이 다르며, 이 차이가 쿼리 성능과 활용 전략에 직접 영향을 준다.

지원 인덱스 타입 비교

PostgreSQL

인덱스용도
B-Tree기본 인덱스, 비교 연산 최적화
Hash동등 연산(=) 빠른 비교
GINFull Text Search, JSONB, 배열 검색
GiST지리 정보(PostGIS), 범위 타입
BRIN대용량 시계열/순차 데이터
SP-GiST트라이 기반 공간 분할

MySQL (InnoDB)

인덱스용도
B-Tree기본 인덱스, 대부분의 경우
HashAdaptive Hash Index (내부 최적화용)
FULLTEXT텍스트 검색
R-TreeGIS 기능 (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;

성능 최적화 포인트

항목PostgreSQLMySQL
B-Tree기본 지원기본 지원
부분 인덱스조건 기반 가능미지원
표현식 인덱스자유로움8.0+ 제한적
텍스트 검색GIN + 고급 기능FULLTEXT 기본
JSONGIN 역색인경로 기반 제한적

정리

PostgreSQL은 인덱싱 기능이 매우 다양하고 복잡한 시나리오에 대응하기 좋다.

MySQL은 일반적인 B-Tree 인덱스로 범위/동등 조건 쿼리를 빠르게 처리하지만, 고급 인덱스 기법에서는 제약이 있다.

데이터 특성과 쿼리 패턴에 따라 적절한 DBMS와 인덱스 전략을 선택하자.