PostgreSQL

HelloPong·2025년 9월 10일

공부

목록 보기
31/39
post-thumbnail

🐘 PostgreSQL vs MySQL: 무엇을 선택할 것인가?

1️⃣ PostgreSQL과 MySQL의 철학

  • MySQL

    • 경량, 빠른 읽기, 단순한 구조에 초점.
    • 웹 서비스(예: WordPress, PHP 기반 서비스)에서 사실상 표준처럼 사용됨.
    • 범용적이고 대중적 → 진입장벽이 낮음.
  • PostgreSQL

    • "세계에서 가장 진보한 오픈소스 RDBMS"라는 슬로건.
    • SQL 표준 준수와 확장성에 초점.
    • 복잡한 쿼리, 대규모 데이터 처리, 데이터 무결성을 중시하는 분야에서 강력.

2️⃣ 기능 비교

구분MySQLPostgreSQL
SQL 표준 준수부분적거의 완벽
트랜잭션ACID 지원(제한적)완전 ACID, MVCC
동시성 제어잠금 기반MVCC로 충돌 최소화
JSON 처리JSON 지원(검색 제한)JSON + JSONB, 색인 지원
인덱스 종류B-Tree, 해시B-Tree, GiST, GIN, BRIN 등 풍부
파티셔닝기본 지원 (InnoDB)강력한 파티셔닝 옵션
확장성플러그인 위주사용자 정의 타입, 함수, FDW
GIS제한적PostGIS로 강력 지원

3️⃣ 장단점 정리

MySQL 장점

  • 배우기 쉽고 사용자 커뮤니티가 방대.
  • 읽기 성능이 우수 → 단순한 웹 서비스에 최적.
  • 호스팅/클라우드에서 기본 제공이 많아 접근성이 높음.

MySQL 단점

  • SQL 표준 지원이 제한적.
  • 복잡한 쿼리나 분석 작업에는 성능 한계.
  • 고급 기능 확장성 부족.

PostgreSQL 장점

  • SQL 표준 준수율이 높아 이식성·호환성 우수.
  • MVCC 기반으로 동시성데이터 무결성 보장.
  • JSONB, PostGIS 등 NoSQL/공간 데이터 처리까지 아우름.
  • 고급 인덱스, 확장성, 사용자 정의 기능 풍부.

PostgreSQL 단점

  • 러닝커브가 높음 → 학습 필요.
  • 단순 읽기 중심 서비스에서는 MySQL 대비 속도가 떨어질 수 있음.
  • 운영 및 최적화 난이도가 상대적으로 높음.

4️⃣ 선택 가이드

  • MySQL 추천

    • 스타트업 초기 웹 서비스
    • CMS/블로그/전자상거래 플랫폼
    • 빠른 구축과 저비용 운영이 중요한 경우
  • PostgreSQL 추천

    • 금융, 공공, 연구기관 등 데이터 무결성이 중요한 곳
    • 빅데이터 분석, 복잡한 쿼리, JSON 기반 서비스
    • 확장 가능한 MSA 아키텍처, 분산 시스템과 연동하는 환경

5️⃣ 정리

👉 MySQL은 빠르고 쉽다는 장점으로 웹서비스에서 여전히 강력한 선택지다.
👉 PostgreSQL은 확장성과 데이터 무결성이 필요한 복잡한 환경에서 진가를 발휘한다.

결론: “빠른 구축과 단순함이면 MySQL, 확장성과 정교한 데이터 관리면 PostgreSQL”


🐘 PostgreSQL의 차별화된 기능과 강점

1️⃣ SQL 표준 준수

  • PostgreSQL은 SQL:2011 표준을 거의 완전 지원.
  • 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 레벨에서 직접 처리 가능.


2️⃣ 동시성 제어: MVCC (Multi-Version Concurrency Control)

  • MySQL InnoDB는 잠금 기반으로 동시성을 보장.
  • PostgreSQL은 MVCC를 통해 동시에 읽기·쓰기 작업을 해도 충돌 최소화.

특징:

  • SELECT는 항상 스냅샷 데이터를 읽음 → 읽기 시 쓰기 작업에 영향 없음.
  • 트랜잭션 간 일관성을 강력히 보장.

3️⃣ JSONB와 반(半) NoSQL 기능

  • MySQL은 JSON 필드 제공하나 색인 제한.
  • PostgreSQL은 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의 유연함을 동시에 확보.


4️⃣ 다양한 인덱스

  • MySQL은 기본적으로 B-Tree 인덱스 위주.

  • PostgreSQL은 다양한 인덱스 제공:

    • B-Tree: 범위 검색
    • GIN: JSONB, 배열, Full-text
    • GiST: 공간 검색, 유사도 검색
    • BRIN: 대규모 시계열 데이터 최적
-- JSONB + GIN 인덱스
CREATE INDEX idx_products_data ON products USING gin (data);

👉 비정형 데이터와 빅데이터 처리에서 성능 차이 극대화.


5️⃣ 확장성과 사용자 정의 기능

  • PostgreSQL은 사용자 정의 자료형, 함수, 연산자를 추가 가능.
  • 외부 DB 연결용 **FDW(Foreign Data Wrapper)**로 이기종 DB 연동 지원.
-- 예: 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에서 여러 데이터 소스를 통합 관리 가능.


6️⃣ GIS 지원: PostGIS

  • PostGIS 확장으로 공간 데이터 처리 지원.
  • 위경도, 거리 계산, 지도 데이터 처리에 특화.
-- 위치 정보 저장
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), 물류, 스마트시티 분석에 강력.


7️⃣ 정리

  • PostgreSQL은 단순 DBMS가 아니라 플랫폼급 확장성을 갖춘 DB.

  • 차별화 포인트:

    1. SQL 표준 준수 → 복잡 쿼리 최적
    2. MVCC → 동시성 보장
    3. JSONB → 반 NoSQL 기능
    4. 인덱스 다양성 → 다양한 데이터 최적화
    5. FDW, PostGIS 등 확장성 → 통합 플랫폼

👉 단순한 CRUD 중심 서비스라면 MySQL,
👉 데이터 분석·대규모 트래픽·복합 데이터 처리라면 PostgreSQL이 정답.


🐘 PostgreSQL 데이터 타입 완벽 정리와 활용 전략

1️⃣ 문자열 타입

타입설명특징MySQL과 차이
char(n)고정 길이 문자열n보다 짧으면 공백으로 채움CHAR(n)과 동일
varchar(n)가변 길이 문자열 (최대 n)성능상 text와 거의 동일MySQL은 text와 구분 확실
text길이 무제한 문자열내부적으로 varchar와 차이 없음MySQL은 text 검색·인덱싱 제한 존재

👉 PostgreSQL에서는 varchar(n)text 차이가 거의 없음.
→ 설계 시 text를 일반적으로 사용하고, 제약 필요 시 varchar(n) 선택.


2️⃣ 숫자 타입

타입범위용도
smallint-32,768 ~ 32,767소규모 정수 (나이, 상태코드 등)
integer약 ±21억기본 정수형
bigint약 ±9경대규모 데이터 ID, 로그 카운트
numeric(p,s) / decimal(p,s)정밀 소수금융, 과학 계산
real, double precision부동소수점통계, 머신러닝, 그래프 계산

👉 돈, 금융 계산은 numeric 사용 (부동소수 오차 방지).


3️⃣ 날짜/시간 타입

타입설명
date날짜만 저장
time시간만 저장
timestamp날짜 + 시간 (타임존 없음)
timestamptz날짜 + 시간 + 타임존 (권장)
interval시간 간격
-- 오늘 날짜 + 7일
SELECT NOW() + INTERVAL '7 days';

👉 글로벌 서비스는 무조건 timestamptz 사용 권장.


4️⃣ JSON과 JSONB

  • 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 선택.


5️⃣ 특수 타입

  • UUID: 전역 고유 ID (분산 시스템에서 PK로 활용).
  • ARRAY: 배열 저장 가능 → 단, RDB 설계 원칙에선 자주 안 씀.
  • ENUM: 미리 정의된 값만 허용 (상태, 카테고리).
  • HSTORE: Key-Value 저장 (단순 K-V 데이터).
  • CIDR, INET: IP 주소/네트워크 저장.
  • GEOGRAPHY/GEOMETRY: PostGIS 확장으로 공간 데이터 처리.

6️⃣ 인덱스와 타입 최적화 전략

  • varchar, textB-Tree 인덱스 가능
  • jsonbGIN 인덱스 활용
  • 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);

👉 데이터 타입 + 인덱스 전략 = 성능 최적화 핵심.


7️⃣ 마이그레이션 시 주의 (MySQL ↔ PostgreSQL)

  • AUTO_INCREMENT → PostgreSQL은 SERIAL 또는 GENERATED AS IDENTITY.
  • boolean → MySQL은 tinyint(1), PostgreSQL은 boolean 타입 있음.
  • enum → MySQL은 컬럼 수준, PostgreSQL은 스키마 수준 타입.
  • datetime → PostgreSQL은 timestamp / timestamptz로 구분.
  • text/varchar → PostgreSQL에서는 큰 차이 없음.

8️⃣ 정리

  • PostgreSQL은 데이터 타입이 풍부하고 정밀하다.
  • 문자열은 varchar(n)text 차이 거의 없음.
  • 금융은 numeric, 글로벌 서비스는 timestamptz, 비정형 데이터는 jsonb 추천.
  • 특수 타입(UUID, ENUM, 배열, PostGIS 등)으로 확장 가능.

👉 PostgreSQL은 **“데이터 모델링 단계에서 더 정교한 선택”**이 가능하다.

0개의 댓글