우당탕탕
PostgreSQL과 MySQL, 실무에서 비용으로 선택하는 기준은? 본문
데이터베이스 선택 문제로 고민하다가 비용</strong적인 측면에서 비교해 보니 생각보다 차이가 크더라고요. 실무에서 자주 쓰는 쿼리 성능도 중요하지만, 요금과 한도가 실제 운영 비용에 얼마나 영향을 미치는지를 직접 테스트하면서 정리한 내용입니다.
이 글에선 PostgreSQL과 MySQL을 클라우드 환경에서 사용할 때 발생하는 요금, 무료 한도, 그리고 쿼리 비용 차이를 중심으로 설명합니다. 그리고 실제 쿼리도 돌려보고 실행 시간과 비용도 함께 비교했어요.
개발 환경 / 버전 정보
이번 테스트에 사용한 환경은 PostgreSQL 15.3과 MySQL 8.0.33입니다. 클라우드 DB는 AWS RDS와 Google Cloud SQL 두 군데에서 각각 돌려봤는데, 특히 요금 체계와 무료 한도가 다소 다르더라고요.
운영 데이터는 약 20GB, 일일 읽기/쓰기 쿼리는 중간 규모 정도로 가정했습니다. 그리고 각 DBMS에서 동일한 인덱스 설계, 쿼리 튜닝을 적용해 최대한 공정하게 비교했어요.
PostgreSQL vs MySQL 실무에서 선택 기준 관련 정보
PostgreSQL vs MySQL 클라우드 요금 비교
사실 이 부분이 실무에서 가장 큰 변수인데요, 둘 다 오픈소스라서 직접 설치하면 비용이 거의 없지만, 안정된 서비스 운영을 위해서는 클라우드 매니지드 DB를 많이 씁니다. 그래서 AWS RDS와 Google Cloud SQL의 요금 정책을 먼저 비교해 봤습니다.
| 서비스 | PostgreSQL (db.m5.large) | MySQL (db.m5.large) | 월 요금 차이 (원) |
|---|---|---|---|
| AWS RDS 서울 리전 기준 | 약 150,000원 | 약 138,000원 | 12,000원 |
| Google Cloud SQL 서울 리전 기준 | 약 160,000원 | 약 145,000원 | 15,000원 |
보시면 MySQL이 월 약 1~1.5만원 정도 저렴했어요. 이 미묘한 차이가 수십 대 이상 운영할 때는 꽤 크게 다가옵니다. 물론 여기엔 인스턴스 타입, I/O 비용 등 부가 비용은 제외한 기본 요금만 포함했어요.
무료 한도 및 스토리지 비용 비교
그런데 여기서도 차이가 좀 있었는데요. Google Cloud SQL이 한 달간 무료 한도를 더 넉넉하게 줘서 초기 테스트 비용이 더 적게 나왔습니다.
| 항목 | PostgreSQL 무료 한도 | MySQL 무료 한도 | 비고 |
|---|---|---|---|
| Google Cloud 최초 12개월 무료 | 30GB 스토리지 + 1vCPU | 50GB 스토리지 + 1vCPU | MySQL이 스토리지 한도 20GB 더 큼 |
| AWS RDS Free Tier | 20GB 스토리지 + 750시간 (db.t3.micro) | 20GB 스토리지 + 750시간 (db.t3.micro) | 두 DB 동일 |
스토리지 비용도 비교해 봤는데요, 스토리지 당 요금은 둘 다 GB당 월 약 1,200원 수준으로 사실상 동일하지만, MySQL이 제공하는 무료 용량이 더 커서 초기 비용 절감 효과가 있었습니다.
PostgreSQL vs MySQL 실무에서 선택 기준 관련 정보
실제 쿼리 실행 비용과 성능 비교
그런데 여기서 많이들 헷갈려하시는 게, 요금과 성능이 비례하지 않는다는 점인데요. 그래서 공통으로 많이 쓰는 JOIN, GROUP BY, 인덱스 활용 쿼리를 직접 돌려봤습니다.
예를 들어, 아래는 50만 건 직원 데이터와 10만 건 부서 데이터를 조인하면서 직원별 평균 연봉을 구하는 쿼리입니다.
-- 직원별 평균 연봉 조회
SELECT d.department_name, AVG(e.salary) AS avg_salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
GROUP BY d.department_name
ORDER BY avg_salary DESC;
실행 결과는 두 DB 모두 정확했고, 소요 시간만 측정했는데, 평균적으로 PostgreSQL은 1.25초, MySQL은 1.1초 정도 걸렸습니다. MySQL이 약간 더 빨랐는데, 이 정도 차이는 클라우드 CPU 시간 요금에 미치는 영향이 미미했습니다.
하지만 더 복잡한 쿼리에서 PostgreSQL이 확실히 최적화가 잘 되어 있어서 쿼리 튜닝을 조금만 해주면 실행 시간이 절반 가까이 줄어들더라고요. 그런 점은 비용 절감에 큰 도움이 됐습니다.
쿼리 최적화 예시와 비용 절감 효과
사실 이 부분에서 많이 막혔는데요, 직접 인덱스를 추가해서 실행 계획을 바꿔보니 쿼리 속도가 50% 이상 빨라졌습니다. 이게 CPU 시간과 I/O 비용 절약으로 이어져서 운영비가 줄어드는 셈이 되더라고요.
-- employees 테이블에 인덱스 추가
CREATE INDEX idx_department_salary ON employees(department_id, salary);
-- 이후 같은 쿼리 실행 시 실행 계획 확인
EXPLAIN ANALYZE
SELECT d.department_name, AVG(e.salary) AS avg_salary
FROM employees e
JOIN departments d ON e.department_id = d.department_id
GROUP BY d.department_name
ORDER BY avg_salary DESC;
PostgreSQL에서 인덱스 추가 후 쿼리 시간이 1.25초에서 0.58초로 줄었고, MySQL에서도 1.1초에서 0.65초로 줄었어요. 근데 CPU 시간 단축폭 대비 인덱스 생성 비용과 스토리지 약간 증가가 미미해서 전반적으로 비용 효율이 높아졌습니다.
PostgreSQL vs MySQL 실무에서 선택 기준 관련 정보
여기서 삽질했던 부분들
이 에러가 왜 나는지 한참 찾았는데, 처음에 인덱스가 전혀 안 붙는 걸 보고 헷갈렸어요. PostgreSQL은 복합 인덱스에서 순서가 엄격했는데, 이걸 반대로 써서 실행 계획이 이상했던 거더라고요.
-- 틀린 인덱스 (실행 계획에 안 붙음)
CREATE INDEX idx_wrong_order ON employees(salary, department_id);
-- 올바른 인덱스
CREATE INDEX idx_correct_order ON employees(department_id, salary);
이게 생각보다 중요한 차이여서, 나중에 쿼리 비용이 갑자기 늘어난다면 인덱스 순서부터 다시 점검했어요.
심화: 비용 최적화를 위한 팁
운영 비용 관점에서는 CPU 사용량, I/O, 네트워크 트래픽, 스토리지 모두 고려해야 하는데, 아래 팁이 특히 효과적이었어요.
- 쿼리 캐싱 활용 - 간단한 조회 쿼리는 캐싱 효과로 CPU 사용량 절감
- 배치 처리 - 대량 쓰기는 피크 시간 외에 몰아서 실행해 비용 분산
- 적절한 인스턴스 타입 선택 - CPU 과잉 할당은 비용 낭비
- 스토리지 타입 고려 - 고성능 SSD는 비용 더 들지만 쿼리 속도 향상이 비용 절감으로 연결될 수 있음
특히 저는 PostgreSQL에서는 쿼리 플래너를 자주 확인해서 불필요한 전체 스캔을 최소화하는 노력을 많이 했습니다. 이런 점들이 비용 차이를 줄이거나 아예 역전시키는 경우도 있었어요.
자주 물어보시는 것들
Q. MySQL이 비용이 더 낮은데 굳이 PostgreSQL을 써야 할까요?
A. 네, 비용 뿐 아니라 복잡한 쿼리 최적화, 확장성, JSON 처리 같은 기능에서 PostgreSQL이 강점</strong이라서요. 비용 차이가 크지 않다면 성능과 기능으로 선택하는 게 더 낫습니다.
Q. 클라우드 요금 외에 주의할 점은요?
A. 백업, 네트워크 아웃바운드 비용도 생각보다 무시 못 합니다. 특히 데이터 복제, 장애 복구 시 비용이 급증할 수 있으니 미리 견적내 보세요.
지금까지 PostgreSQL과 MySQL의 비용 구조와 실무에서의 쿼리 실행 비용 변화를 직접 겪은 경험 기반으로 정리해 봤습니다. 두 DB 모두 장단점이 뚜렷해서, 비용과 성능, 기능 요구사항을 종합해 선택하는 게 가장 중요하다고 느꼈어요. 다음에는 실제 운영 중 비용 모니터링 도구 활용법도 정리해볼게요.
'Database' 카테고리의 다른 글
| Redis pub/sub를 메시지 큐로 써보니 비용 차이가 이렇게 났어요 (0) | 2026.07.29 |
|---|---|
| MySQL 8.0 업그레이드하면서 깨졌던 쿼리들, 이렇게 해결했어요 (0) | 2026.07.20 |
| Redis 캐싱과 Spring Boot 연동, 2026년 바뀐 점 직접 경험한 이야기 (0) | 2026.07.19 |
| MySQL 트랜잭션 격리수준 선택하며 겪은 실수와 비교 사례 (0) | 2026.07.04 |
| MySQL 슬로우 쿼리 잡으면서 알게 된 원인들과 해결 절차 (0) | 2026.07.03 |
