| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Dependency Injection
- @test
- 컨테이너
- spring
- Di
- myBatis
- @JUnit
- POJO
- SpringJDBC
- 리눅스
- spring aop
- Linux
- @AspectJ
- Spring JDBC
- JDBC TEMPLATE
- Spring Boot
- spring framework
- 마이바티스
- AOP
- 프로퍼티
- Ubunt
- XML
- JdbcTemplate
- java
- @Spring-Test
- Framework
- STS
- pointcut
- unix
- java spring
- Today
- Total
개키우는개발자 : )
PostgreSQL vs MySQL 2026 완벽 비교 - 어떤 DB를 선택해야 할까? 본문
새 프로젝트를 시작할 때마다 고민되는 질문이다. "PostgreSQL이랑 MySQL 중에 뭘 써야 하지?"
2026년 기준으로 두 데이터베이스를 비교하고, 상황별 선택 가이드를 정리한다.
한눈에 보는 비교표
항목 PostgreSQL MySQL
| 타입 | 객체 관계형 (ORDBMS) | 관계형 (RDBMS) |
| 라이선스 | PostgreSQL License (완전 무료) | GPL (상용 시 유료 가능) |
| 최신 버전 (2026) | 17.x | 8.4 LTS / 9.x |
| 강점 | 복잡한 쿼리, 데이터 무결성 | 단순 읽기, 빠른 속도 |
| 약점 | 메모리 사용량 높음 | 복잡한 쿼리 성능 |
| 적합한 용도 | 금융, 분석, 대규모 시스템 | 웹사이트, 중소규모 앱 |
1. 성능 비교
읽기 성능
단순 SELECT 쿼리는 MySQL이 빠르다.
MySQL: 단순 읽기 위주 → 승리
PostgreSQL: 복잡한 읽기 → 승리
MySQL은 여러 사용자가 접속해도 단일 프로세스로 처리한다. PostgreSQL은 사용자마다 새 프로세스를 생성해서 메모리를 더 쓴다.
쓰기 성능
빈번한 UPDATE가 있다면 주의가 필요하다.
MySQL: UPDATE 시 기존 행을 직접 수정
PostgreSQL: UPDATE 시 기존 행 삭제 표시 + 새 행 추가 (MVCC)
PostgreSQL의 UPDATE는 내부적으로 DELETE + INSERT처럼 동작한다. UPDATE가 많은 서비스에서는 VACUUM 관리가 필요하다.
복잡한 쿼리
JOIN이 많거나 서브쿼리가 복잡하면 PostgreSQL이 압도적이다.
-- 복잡한 분석 쿼리 예시
WITH monthly_sales AS (
SELECT
DATE_TRUNC('month', order_date) AS month,
SUM(amount) AS total
FROM orders
GROUP BY 1
)
SELECT
month,
total,
LAG(total) OVER (ORDER BY month) AS prev_month,
total - LAG(total) OVER (ORDER BY month) AS diff
FROM monthly_sales;
PostgreSQL은 Hash Join, Merge Join, Nested Loop 중 최적을 선택한다. MySQL은 주로 Nested Loop만 사용해서 대량 JOIN에서 느릴 수 있다.
실제 벤치마크 (우아한형제들 기술블로그 참고)
테스트 MySQL PostgreSQL
| 단순 OLTP | 빠름 | 보통 |
| 1000만 건 JOIN | 22초 | 3초 |
| 병렬 쿼리 | 제한적 | 완전 지원 |
복잡한 쿼리에서는 PostgreSQL이 7배 이상 빠를 수 있다.
2. 기능 비교
JSON 지원
둘 다 JSON을 지원하지만 수준이 다르다.
PostgreSQL
-- JSONB 타입 (바이너리, 인덱싱 가능)
CREATE TABLE products (
id SERIAL PRIMARY KEY,
data JSONB
);
-- JSON 필드 인덱스
CREATE INDEX idx_products_data ON products USING GIN (data);
-- JSON 쿼리
SELECT * FROM products
WHERE data->>'category' = 'electronics';
MySQL
-- JSON 타입
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
data JSON
);
-- JSON 쿼리 (인덱스 제한적)
SELECT * FROM products
WHERE JSON_EXTRACT(data, '$.category') = 'electronics';
PostgreSQL의 JSONB는 인덱싱이 완벽하게 지원된다. MySQL JSON도 8.0부터 많이 좋아졌지만 PostgreSQL이 앞선다.
인덱스 종류
인덱스 타입 PostgreSQL MySQL
| B-tree | ✓ | ✓ |
| Hash | ✓ | ✓ |
| GiST (공간) | ✓ | ✗ |
| GIN (전문검색) | ✓ | ✗ |
| BRIN (대용량) | ✓ | ✗ |
| 부분 인덱스 | ✓ | ✗ |
| Full-text | ✓ | ✓ |
PostgreSQL이 더 다양한 인덱스를 지원한다. 특히 부분 인덱스는 대용량 테이블에서 유용하다.
-- PostgreSQL 부분 인덱스
CREATE INDEX idx_active_users ON users(email)
WHERE status = 'active';
확장 기능
PostgreSQL 대표 확장
- PostGIS: 지리공간 데이터
- pgvector: AI/ML 벡터 저장
- pg_trgm: 유사 문자열 검색
- TimescaleDB: 시계열 데이터
MySQL 대표 확장
- 스토리지 엔진 선택 (InnoDB, MyISAM)
- MySQL Router: 로드밸런싱
PostgreSQL은 확장 생태계가 더 풍부하다. 특히 AI 시대에 pgvector는 큰 장점이다.
3. SQL 문법 차이
AUTO_INCREMENT vs SERIAL
-- MySQL
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
-- PostgreSQL
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
-- PostgreSQL (명시적)
CREATE TABLE users (
id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(50)
);
문자열 비교
-- MySQL (대소문자 구분 안함)
SELECT * FROM users WHERE name = 'John'; -- 'john'도 매칭
-- PostgreSQL (대소문자 구분함)
SELECT * FROM users WHERE name = 'John'; -- 정확히 'John'만
SELECT * FROM users WHERE name ILIKE 'john'; -- 대소문자 무시
LIMIT 문법
-- MySQL
SELECT * FROM users LIMIT 10 OFFSET 20;
SELECT * FROM users LIMIT 20, 10; -- MySQL만 가능
-- PostgreSQL
SELECT * FROM users LIMIT 10 OFFSET 20;
SELECT * FROM users FETCH FIRST 10 ROWS ONLY; -- 표준 SQL
UPSERT
-- MySQL
INSERT INTO users (id, name, email) VALUES (1, 'Kim', 'kim@test.com')
ON DUPLICATE KEY UPDATE name = VALUES(name), email = VALUES(email);
-- PostgreSQL
INSERT INTO users (id, name, email) VALUES (1, 'Kim', 'kim@test.com')
ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, email = EXCLUDED.email;
4. 운영 관점 비교
복제 (Replication)
항목 PostgreSQL MySQL
| 물리적 복제 | ✓ (Streaming) | ✓ |
| 논리적 복제 | ✓ (10버전+) | ✓ |
| 멀티마스터 | 확장으로 가능 | 기본 지원 |
| 설정 난이도 | 중간 | 쉬움 |
MySQL이 복제 설정이 더 쉽다. PostgreSQL은 더 세밀한 제어가 가능하다.
백업
PostgreSQL
# 논리 백업
pg_dump mydb > backup.sql
# 물리 백업
pg_basebackup -D /backup -Fp -Xs -P
MySQL
# 논리 백업
mysqldump mydb > backup.sql
# 물리 백업 (Enterprise 또는 Percona XtraBackup)
xtrabackup --backup --target-dir=/backup
둘 다 비슷한 수준의 백업 도구를 제공한다.
모니터링
PostgreSQL
-- 실행 중인 쿼리
SELECT * FROM pg_stat_activity;
-- 테이블 통계
SELECT * FROM pg_stat_user_tables;
-- 슬로우 쿼리 (pg_stat_statements 확장)
SELECT query, calls, mean_time FROM pg_stat_statements
ORDER BY mean_time DESC LIMIT 10;
MySQL
-- 실행 중인 쿼리
SHOW PROCESSLIST;
-- 테이블 상태
SHOW TABLE STATUS;
-- 슬로우 쿼리 (설정 필요)
SELECT * FROM mysql.slow_log;
5. 클라우드 지원
AWS
서비스 PostgreSQL MySQL
| RDS | ✓ | ✓ |
| Aurora | Aurora PostgreSQL | Aurora MySQL |
| 서버리스 | Aurora Serverless v2 | Aurora Serverless v2 |
기타 클라우드
- Supabase: PostgreSQL 기반 (Firebase 대안)
- PlanetScale: MySQL 기반 (서버리스)
- Neon: PostgreSQL 서버리스
PostgreSQL 기반 Supabase가 요즘 인기가 많다. 오픈소스 + 실시간 기능 + Auth까지 제공한다.
6. 선택 가이드
PostgreSQL을 선택해야 할 때
- 복잡한 쿼리와 분석이 많은 경우
- 데이터 무결성이 중요한 금융/의료 시스템
- JSON, 지리공간 데이터를 많이 다루는 경우
- AI/ML 벡터 저장이 필요한 경우 (pgvector)
- 대규모 트랜잭션 처리 (OLTP + OLAP)
- 표준 SQL 준수가 중요한 경우
MySQL을 선택해야 할 때
- 단순한 CRUD 위주의 웹 애플리케이션
- 읽기 작업이 대부분인 서비스
- WordPress, Laravel 등 MySQL 기본 지원 프레임워크 사용
- 빠른 개발과 쉬운 운영이 필요한 경우
- 팀에서 MySQL 경험이 많은 경우
프로젝트 유형별 추천
프로젝트 추천
| 블로그, 쇼핑몰 | MySQL |
| 스타트업 MVP | MySQL (빠른 시작) |
| 금융 서비스 | PostgreSQL |
| 데이터 분석 플랫폼 | PostgreSQL |
| AI/챗봇 서비스 | PostgreSQL (pgvector) |
| 지도 기반 서비스 | PostgreSQL (PostGIS) |
| 대규모 SaaS | PostgreSQL |
| WordPress 사이트 | MySQL |
| 레거시 마이그레이션 | 기존 시스템 유지 |
7. 2026년 트렌드
PostgreSQL의 상승세
- Stack Overflow 설문에서 가장 사랑받는 DB 1위
- AI/ML 붐으로 pgvector 수요 급증
- Supabase, Neon 등 신규 서비스 성장
- 클라우드 네이티브 환경에서 선호도 증가
MySQL의 현재
- 여전히 웹 애플리케이션 시장 점유율 1위
- 8.4 LTS로 안정성 강화
- 9.x에서 Vector 타입 추가 (PostgreSQL 추격)
- PlanetScale 등 서버리스 옵션 증가
결론
복잡한 것 → PostgreSQL
단순한 것 → MySQL
모르겠으면 → PostgreSQL (더 범용적)
2026년 현재, PostgreSQL의 인기가 빠르게 상승 중이다. 특히 AI/ML, 데이터 분석 분야에서는 PostgreSQL이 사실상 표준이 되어가고 있다.
하지만 MySQL도 여전히 강력한 선택지다. WordPress, Laravel 생태계에서는 MySQL이 더 편하고, 단순한 웹 애플리케이션에서는 충분히 좋은 성능을 낸다.
결국 "정답"은 없다. 프로젝트 요구사항, 팀 경험, 장기 유지보수를 고려해서 선택하면 된다.
마이그레이션 참고
MySQL에서 PostgreSQL로 넘어가거나 그 반대의 경우가 있다면 별도의 마이그레이션 가이드를 참고하자.
문법 차이와 데이터 타입 변환에 주의가 필요하다.