우당탕탕
2026년 기준 PostgreSQL과 MySQL 실무 선택, 바뀐 점과 팁 본문
데이터베이스를 고르려다 보니 PostgreSQL과 MySQL 사이에서 너무 고민이 많았어요. 특히 2026년 들어 두 제품의 기능과 성능, 관리 편의성에 여러 변화가 있더라고요. 이걸 직접 쿼리도 작성해 보고 실행 결과도 보면서 체감하니까, 단순히 ‘어느 게 더 낫다’가 아니라 상황별 선택 기준을 확실히 잡아야겠다는 생각이 들었죠.
이번 글에서는 2026년 버전 기준으로 PostgreSQL과 MySQL의 최신 변화를 중심으로, 제가 직접 실무에서 테스트해 본 쿼리와 성능 결과를 바탕으로 어떤 상황에서 어느 DB를 선택하는 게 좋을지 알려드릴게요. 그리고 이 과정에서 제가 겪었던 삽질과 그 해결 방법도 살짝 공유할게요.
개발 환경 / 버전 정보
이번 테스트는 PostgreSQL 15.3과 MySQL 8.1를 사용했어요. 2026년 6월 현재 각 최신 안정화 버전이고, 두 DB 모두 이번에 쿼리 최적화와 JSON 처리, 인덱스 기능에서 주요 개선점이 있었어요.
서버는 Ubuntu 22.04 LTS, CPU는 8코어, 메모리 32GB 환경에서 진행했습니다.
2026년 최신 변화를 살펴보니
사실 작년과 가장 크게 달라진 부분이 성능 개선과 JSON 처리 기능이에요. MySQL 8.1에서는 JSON 인덱스 생성이 훨씬 유연해졌고, PostgreSQL 15.3은 쿼리 최적화 엔진에 더 정교한 플래너가 탑재됐죠. 둘 다 JSON 문서형 데이터를 많이 다루는 요즘 환경에 맞춰진 업데이트라서, 제가 직접 테스트해보니 이전과는 완전히 다른 결과가 나왔어요.
또한, MySQL은 now() 함수 내부 처리 방식이 변경되어 동일 쿼리 반복 시 시간값이 더 정확해졌고, PostgreSQL은 병렬 쿼리 처리 최적화가 크게 향상됐더라고요. 이 부분은 특히 대용량 데이터 처리할 때 체감 차이가 컸습니다.
실제 쿼리로 성능 비교해봤어요
여기서 많이 헷갈리는 게, 두 DB 모두 같은 SQL을 완벽히 지원하지 않아서 쿼리를 어떻게 작성하느냐에 따라 성능 차이가 크게 난다는 점이에요. 그래서 동일한 데이터셋으로 두 DB용 쿼리를 약간 다르게 쓰고 각각 실행했죠.
아래는 500만 건 동적 JSON 데이터를 포함한 주문 테이블에서 특정 날짜 범위와 JSON 속성 조건을 만족하는 고객 수를 가져오는 쿼리예요.
-- PostgreSQL 쿼리 예시
SELECT COUNT(DISTINCT customer_id)
FROM orders
WHERE order_date BETWEEN '2026-01-01' AND '2026-06-01'
AND order_data->>'status' = 'completed';
PostgreSQL은 JSONB 타입 컬럼 order_data에서 status 값을 바로 꺼내 조건할 수 있는데, 이 부분에 인덱스를 걸면 조회 성능이 엄청나게 좋아졌어요.
-- 인덱스 생성
CREATE INDEX idx_order_data_status ON orders USING GIN ((order_data->>'status'));
실행해보니, 쿼리 시간이 평균 0.23초로 줄었고, 이전 버전에서는 0.7초 이상 걸리던 게 확실히 개선됐어요.
MySQL은 JSON 타입을 그대로 조회하는 방식이 조금 달라서, 아래처럼 JSON_EXTRACT 함수를 썼는데요. 8.1부터는 이 부분 인덱스 지원이 좋아졌다고 해서 인덱스도 걸어봤어요.
-- MySQL 쿼리 예시
SELECT COUNT(DISTINCT customer_id)
FROM orders
WHERE order_date BETWEEN '2026-01-01' AND '2026-06-01'
AND JSON_UNQUOTE(JSON_EXTRACT(order_data, '$.status')) = 'completed';
-- Functional index 생성 (MySQL 8.1+)
CREATE INDEX idx_order_status ON orders ((JSON_UNQUOTE(JSON_EXTRACT(order_data, '$.status'))));
실행 시 평균 0.32초 정도로, 역시 이전보다 빨라졌지만 PostgreSQL보다 약간 느리네요.
제가 삽질했던 부분과 해결 과정
이 JSON 인덱스 문제 때문에 한참 헤맸어요. 특히 MySQL에서 인덱스가 무시되는 현상이 있었는데, 그게 2025년 버전까지는 함수 기반 인덱스 지원이 제한적이었지만, 2026년 들어서야 제대로 활용 가능해진 점이 반영되어 있지 않아서 그랬더라고요.
아래 에러 메시지를 보고도 원인을 못 찾아 한참 낑낑댔었는데...
ERROR 3819 (HY000): This version of MySQL doesn't yet support functional key parts
MySQL을 8.0 버전대에서 쓰던 때와 달리 8.1에서는 기능적으로 달라진 부분이 많아서, 꼭 공식 문서에서 기능 지원 범위를 확인하는 습관이 필요하다는 걸 깨달았죠.
이렇게 선택하면 됩니다
요즘은 JSON이나 복합 데이터 타입 지원이 중요해져서, 둘 다 기능이 꽤 좋아졌어요. 하지만 복잡한 JSON 쿼리와 다양한 인덱스 활용, 확장성을 중요하게 생각하면 PostgreSQL 쪽이 더 낫다고 저는 느꼈습니다.
반대로, 이미 MySQL 기반 인프라가 튼튼하고, 비교적 단순한 JSON 조회 위주라면 8.1 버전 업데이트 이후 MySQL을 쓰는 것도 충분히 추천할 만해요. 특히 개발자 커뮤니티 지원도 여전히 활발하고, 운영 경험이 많은 프로젝트라면요.
자주 물어보시는 것들
Q. 2026년에도 MySQL과 PostgreSQL 쿼리 호환성은 어떤가요?
A. 기본 DML은 비슷하지만 고급 기능(윈도우 함수, JSON 함수 등)은 차이가 더 커졌어요. 특히 JSON 경로 표현법과 함수 이름이 다릅니다. 쿼리 작성 시 꼭 쿼리별로 테스트해보셔야 해요.
Q. 두 DB 모두 병렬 쿼리 처리를 지원하나요?
A. 네, 다만 PostgreSQL 15.3에서 병렬 쿼리 최적화가 한층 더 진전됐고, MySQL도 8.1에서 병렬 조인 기능을 개선했어요. 체감 성능은 환경마다 다르지만 대체로 PostgreSQL 쪽이 더 빨라졌다는 평가가 많아요.
Q. 운영 환경에서 마이그레이션 고려할 때 주의할 점은?
A. 인덱스와 JSON 함수 차이, 트랜잭션 격리 수준 차이에 유의해야 합니다. 특히 2026년 기준 변경된 함수 동작이나 기본 설정이 변경된 부분을 미리 점검해야 데이터 손실 없이 무리 없이 마이그레이션할 수 있어요.
요즘 데이터베이스는 계속 변하기 때문에, 저는 항상 최신 릴리즈 노트와 직접 실행해 보는 테스트를 병행하고 있어요. 이렇게 하니 갑자기 성능이 이상해지거나 기능이 안 돌아가는 순간을 최대한 줄일 수 있더라고요.
'Database' 카테고리의 다른 글
| MySQL 트랜잭션 격리수준, 2026년 바뀐 점과 실수 사례 모두 정리했어요 (0) | 2026.06.05 |
|---|---|
| MySQL 슬로우 쿼리 잡으면서 제가 저지른 실수와 해결법 (0) | 2026.06.02 |
| MongoDB 처음 써보면서 RDBMS와 달라서 놀랐던 부분들 직접 정리했어요 (0) | 2026.05.30 |
| MongoDB 처음 써보면서 RDBMS와 확실히 달랐던 부분들 정리해봤어요 (0) | 2026.05.29 |
| Redis 캐싱 Spring Boot 연동 직접 구현해보니 쾌적한 성능 체감했어요 (0) | 2026.05.27 |
