Contents
see List작성일 2025. 11. 30.
PostgreSQL vs MySQL - 어떤 DB를 선택할까
프로젝트에 적합한 데이터베이스를 선택하는 것은 중요한 아키텍처 결정입니다.
비교 요약
| 항목 | PostgreSQL | MySQL |
|---|---|---|
| 철학 | 표준 준수, 확장성 | 속도, 단순함 |
| JSON | JSONB (뛰어남) | JSON (기본) |
| 복잡한 쿼리 | 우수 | 보통 |
| 레플리케이션 | 스트리밍 | 바이너리 로그 |
| 라이선스 | PostgreSQL | GPL (Oracle 소유) |
PostgreSQL이 좋은 경우
- 복잡한 쿼리, 분석 작업이 많을 때
- JSON 데이터를 많이 다룰 때
- GIS/지리 데이터 처리 (PostGIS)
- ACID 완전 준수가 중요할 때
- 확장성과 커스터마이징 필요
MySQL이 좋은 경우
- 단순한 CRUD 위주 웹 애플리케이션
- 읽기 성능이 중요할 때
- 레거시 시스템과 호환
- AWS Aurora 사용 계획
- 팀이 MySQL에 익숙할 때
기능 상세 비교
-- PostgreSQL JSONB (인덱싱 지원)
CREATE INDEX idx_data ON products USING GIN (data jsonb_path_ops);
SELECT * FROM products WHERE data @> \047{"color": "red"}\047;
-- MySQL JSON
SELECT * FROM products WHERE JSON_EXTRACT(data, "$.color") = "red";
-- PostgreSQL 배열 타입
CREATE TABLE tags (id INT, names TEXT[]);
SELECT * FROM tags WHERE \047tech\047 = ANY(names);
-- PostgreSQL CTE (WITH 절)
WITH RECURSIVE subordinates AS (
SELECT id, name, manager_id FROM employees WHERE id = 1
UNION ALL
SELECT e.id, e.name, e.manager_id
FROM employees e JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;성능 특성
# PostgreSQL
- 쓰기: MVCC로 동시성 우수
- 읽기: 복잡한 쿼리에 강함
- 인덱스: GiST, GIN, BRIN 등 다양
# MySQL (InnoDB)
- 읽기: 단순 쿼리 빠름
- 쓰기: 간단한 INSERT 빠름
- 클러스터드 인덱스 기반결론
복잡한 엔터프라이즈 → PostgreSQL
단순한 웹앱 → MySQL
확실하지 않으면 → PostgreSQL (더 유연함)
database
| No | 작성일 | Title |
|---|---|---|
| 326 | 2015. 11. 04. | [ oracle ] SET DEFINE OFF - 특수문자 인서트시 문자열로 인식하기 |
| 317 | 2015. 10. 15. | [ oracle ] merge |
| 287 | 2015. 06. 02. | [ Oracle ] update join view 이용하여 빠른 업데이트 |
| 274 | 2015. 05. 02. | [ Oracle ] 오라클 계층구조 즉 댓글 전부 삭제하기 |
| 272 | 2015. 04. 29. | [ oracle ] 널처리 NVL , NVL2 함수 |
| 271 | 2015. 04. 29. | [ Oracle ] 오라클 계증구조 쿼리 답글 댓글리스트 |
| 266 | 2015. 03. 26. | [ oracle ] 오라클 drop table ( 테이블 삭제) 시 복구방법 |
| 166 | 2015. 03. 02. | [ oracle ] ORA-28001: the password has expired 처리방법 |
| 143 | 2015. 01. 24. | [ Oracle ] 오라클 dmp 파일로 쉬운 복구 |
| 124 | 2015. 01. 05. | [ Oracle ] 오라클에서 날짜의 월 간격구하기 |