본문 바로가기
C.W.K.
Stream
Lesson 07 of 10 · published

SQLite vs PostgreSQL vs MySQL

~15 min · sqlite, comparison, postgres, mysql

Level 0Scout
0 XP0/80 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

셋은 경쟁자가 아니야

이 셋을 경쟁자처럼 나란히 놓고 얘기하는 경우가 많은데, 사실은 서로 다른 질문에 답하는 도구야.

속성SQLitePostgreSQLMySQL
아키텍처In-process 라이브러리Client/serverClient/server
배포파일 한 개데몬 + 설정데몬 + 설정
동시 writer한 번에 한 명 (파일당)다수, MVCC다수, MVCC
동시 reader무제한 (WAL)무제한무제한
TypingDynamic (또는 STRICT 3.37+)Strict, richStrict
ReplicationAdd-on (Litestream/LiteFS/Turso)Built-in streamingBuilt-in (binlog)
JSONJSON1 + JSONB (3.45+)JSONB nativeJSON native
Full-text searchFTS5 빌트인tsvectorFULLTEXT (InnoDB)
인증 모델파일시스템Roles + RLSUser accounts
Best fit앱 내 데이터 레이어Multi-tenant 시스템웹앱 DB tier
Principle: 기능 체크리스트로 고르지 말고 배포 모양으로 골라. 데이터에 여러 머신이 닿아야 하면 서버가 필요해. 데이터가 코드 도는 자리에 같이 살아도 된다면 SQLite가 운영 관심사 한 층을 통째로 없애줘.

앱 레벨 워크로드만 놓고 보면 요즘 SQLite는 Postgres와의 기능 격차를 거의 다 메웠어. JSON, FTS, window function, CTE, generated column, partial index, expression index, UPSERT, RETURNING이 다 있으니까. 못 메운 건 여러 머신에서 동시에 쓰는 격차 하나고, 거긴 메우는 척도 안 해.

Code

같은 SQL, 세 엔진·sql
-- 셋 다 이 statement 그대로 돌아감
CREATE TABLE users (
  id    INTEGER PRIMARY KEY,
  email TEXT UNIQUE NOT NULL,
  name  TEXT NOT NULL
);

INSERT INTO users(email, name) VALUES ('alice@x.com', 'Alice');

SELECT id, email, name FROM users WHERE name = 'Alice';

-- 차이는 SQL 이 아니라 배포 스토리에서 생겨.

External links

Exercise

한 페이지짜리 결정 메모를 써봐. 주제는 'X에는 SQLite와 Postgres와 MySQL 중 뭘 쓸까'야. 실제든 가상이든 서비스를 하나 골라서, 배포 모양(머신 한 대냐 여러 대냐), write 동시성, replication이 필요한지, 운영에 드는 비용을 기준으로 결정을 내려. 그리고 세 줄로 그 선택을 변호해봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.