
MySQL
PostgreSQL
| 구분 | MySQL | PostgreSQL |
|---|---|---|
| SQL 표준 준수 | 부분적 | 거의 완벽 |
| 트랜잭션 | ACID 지원(제한적) | 완전 ACID, MVCC |
| 동시성 제어 | 잠금 기반 | MVCC로 충돌 최소화 |
| JSON 처리 | JSON 지원(검색 제한) | JSON + JSONB, 색인 지원 |
| 인덱스 종류 | B-Tree, 해시 | B-Tree, GiST, GIN, BRIN 등 풍부 |
| 파티셔닝 | 기본 지원 (InnoDB) | 강력한 파티셔닝 옵션 |
| 확장성 | 플러그인 위주 | 사용자 정의 타입, 함수, FDW |
| GIS | 제한적 | PostGIS로 강력 지원 |
MySQL 추천
PostgreSQL 추천
👉 MySQL은 빠르고 쉽다는 장점으로 웹서비스에서 여전히 강력한 선택지다.
👉 PostgreSQL은 확장성과 데이터 무결성이 필요한 복잡한 환경에서 진가를 발휘한다.
결론: “빠른 구축과 단순함이면 MySQL, 확장성과 정교한 데이터 관리면 PostgreSQL”
Window 함수, CTE (Common Table Expression), Recursive Query 등을 MySQL보다 먼저 안정적으로 제공.-- 재귀 쿼리 예시 (조직 계층 구조 탐색)
WITH RECURSIVE subordinates AS (
SELECT id, name, manager_id
FROM employees
WHERE id = 1
UNION
SELECT e.id, e.name, e.manager_id
FROM employees e
INNER JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;
👉 복잡한 비즈니스 로직을 DB 레벨에서 직접 처리 가능.
특징:
SELECT는 항상 스냅샷 데이터를 읽음 → 읽기 시 쓰기 작업에 영향 없음.JSON 필드 제공하나 색인 제한.jsonb 타입으로 검색·색인 최적화 지원.-- JSONB 예시
CREATE TABLE products (
id SERIAL PRIMARY KEY,
data JSONB
);
INSERT INTO products (data) VALUES ('{"name": "Phone", "price": 500, "tags": ["electronics","mobile"]}');
-- JSON 검색
SELECT data->>'name' AS name
FROM products
WHERE data->>'price' = '500';
👉 RDBMS의 안정성과 NoSQL의 유연함을 동시에 확보.
MySQL은 기본적으로 B-Tree 인덱스 위주.
PostgreSQL은 다양한 인덱스 제공:
-- JSONB + GIN 인덱스
CREATE INDEX idx_products_data ON products USING gin (data);
👉 비정형 데이터와 빅데이터 처리에서 성능 차이 극대화.
-- 예: PostgreSQL에서 MySQL 테이블 직접 조회
CREATE EXTENSION mysql_fdw;
CREATE SERVER mysql_server FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '127.0.0.1', port '3306');
CREATE USER MAPPING FOR postgres SERVER mysql_server OPTIONS (username 'root', password 'root');
IMPORT FOREIGN SCHEMA testdb FROM SERVER mysql_server INTO public;
👉 하나의 PostgreSQL에서 여러 데이터 소스를 통합 관리 가능.
-- 위치 정보 저장
CREATE TABLE places (
id SERIAL PRIMARY KEY,
name TEXT,
geom GEOGRAPHY(Point, 4326)
);
-- 반경 5km 내 검색
SELECT name
FROM places
WHERE ST_DWithin(geom, ST_MakePoint(127.0, 37.5)::geography, 5000);
👉 위치 기반 서비스(LBS), 물류, 스마트시티 분석에 강력.
PostgreSQL은 단순 DBMS가 아니라 플랫폼급 확장성을 갖춘 DB.
차별화 포인트:
👉 단순한 CRUD 중심 서비스라면 MySQL,
👉 데이터 분석·대규모 트래픽·복합 데이터 처리라면 PostgreSQL이 정답.
| 타입 | 설명 | 특징 | MySQL과 차이 |
|---|---|---|---|
char(n) | 고정 길이 문자열 | n보다 짧으면 공백으로 채움 | CHAR(n)과 동일 |
varchar(n) | 가변 길이 문자열 (최대 n) | 성능상 text와 거의 동일 | MySQL은 text와 구분 확실 |
text | 길이 무제한 문자열 | 내부적으로 varchar와 차이 없음 | MySQL은 text 검색·인덱싱 제한 존재 |
👉 PostgreSQL에서는 varchar(n)과 text 차이가 거의 없음.
→ 설계 시 text를 일반적으로 사용하고, 제약 필요 시 varchar(n) 선택.
| 타입 | 범위 | 용도 |
|---|---|---|
smallint | -32,768 ~ 32,767 | 소규모 정수 (나이, 상태코드 등) |
integer | 약 ±21억 | 기본 정수형 |
bigint | 약 ±9경 | 대규모 데이터 ID, 로그 카운트 |
numeric(p,s) / decimal(p,s) | 정밀 소수 | 금융, 과학 계산 |
real, double precision | 부동소수점 | 통계, 머신러닝, 그래프 계산 |
👉 돈, 금융 계산은 numeric 사용 (부동소수 오차 방지).
| 타입 | 설명 |
|---|---|
date | 날짜만 저장 |
time | 시간만 저장 |
timestamp | 날짜 + 시간 (타임존 없음) |
timestamptz | 날짜 + 시간 + 타임존 (권장) |
interval | 시간 간격 |
-- 오늘 날짜 + 7일
SELECT NOW() + INTERVAL '7 days';
👉 글로벌 서비스는 무조건 timestamptz 사용 권장.
json: 입력 그대로 저장 (빠른 입력, 느린 검색).jsonb: 내부적으로 파싱 후 저장 (검색·색인 빠름).-- JSONB 예시
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
data JSONB
);
INSERT INTO orders (data) VALUES
('{"user":"kim","items":[{"name":"book","qty":2}]}');
-- JSON 데이터 검색
SELECT data->>'user' AS user_name
FROM orders
WHERE data @> '{"items":[{"name":"book"}]}';
👉 실무: 대부분 jsonb 선택.
varchar, text → B-Tree 인덱스 가능jsonb → GIN 인덱스 활용timestamp → 시계열 데이터에 BRIN 인덱스 적합-- JSONB GIN 인덱스
CREATE INDEX idx_orders_data ON orders USING gin (data);
-- 시계열 BRIN 인덱스
CREATE INDEX idx_logs_time ON logs USING brin (created_at);
👉 데이터 타입 + 인덱스 전략 = 성능 최적화 핵심.
AUTO_INCREMENT → PostgreSQL은 SERIAL 또는 GENERATED AS IDENTITY.boolean → MySQL은 tinyint(1), PostgreSQL은 boolean 타입 있음.enum → MySQL은 컬럼 수준, PostgreSQL은 스키마 수준 타입.datetime → PostgreSQL은 timestamp / timestamptz로 구분.text/varchar → PostgreSQL에서는 큰 차이 없음.varchar(n)과 text 차이 거의 없음.numeric, 글로벌 서비스는 timestamptz, 비정형 데이터는 jsonb 추천.👉 PostgreSQL은 **“데이터 모델링 단계에서 더 정교한 선택”**이 가능하다.