728x90
※ IT: RDBMS Table Design Checklist.
안녕하세요. 듀스트림입니다.
오늘은 RDBMS 테이블 설계 시 고려해야 할 사항에 대한 내용입니다.
DBMS는 PostgreSQL과 MySQL 기준으로 작성했습니다.
1. 배경 지식
| 용어 | 설명 |
| MVCC + HOT (PostgreSQL) | - 한 페이지 안에서 버전 교체가 가능하면 HOT Update로 인덱스-I/O를 줄임. - 페이지 여유 공간은 fillfactor로 확보. |
| 논리 복제 + SEQUENCE (Postgres) | - PG 17부터 ALTER PUBLICATION ADD ALL SEQUENCES 지원 → 시퀀스 값 복제 문제 감소. |
| 파티션 한계 (Postgres) | - 파티션 수가 증가하면 플래너 시간이 급증 → 최소로 설계 권장, pg_stat_statements.track_planning 로 모니터링 |
| Clustered Index (InnoDB) | - PK 순서대로 데이터가 저장됨. 폭이 큰 PK(예: UUID) 는 B-Tree split·Redo 양 증가 → 쓰기 병목. |
| Gap Lock (InnoDB) | - “없는 값” 구간까지 잠궈 새 행 삽입을 막음. - 범위 업데이트가 잦으면 고카디널리티 인덱스 필수. |
| AUTO_INCREMENT Lock Mode (InnoDB) | - innodb_autoinc_lock_mode = 2 (interleaved) 로 다중 노드 삽입 대기 완화. |
| 온라인 DDL | - PostgreSQL REINDEX CONCURRENTLY - MySQL ALGORITHM=INPLACE LOCK=NONE 로 서비스 중 재구성 가능. |
• Gap Lock
인덱스에 존재하지 않는 구간까지 잠가 다른 트랜잭션의 INSERT 를 차단한다. 범위 UPDATE/DELETE 쿼리가 잦으면 데드락 위험↑
• AUTO_INCREMENT Lock Mode
innodb_autoinc_lock_mode
• 0 (traditional)
• 1 (consecutive)
• 2 (interleaved, 기본값): 동일 테이블에 병렬 INSERT 시에도 잠금 대기를 거의 제거
2. PostgreSQL 체크리스트
| 카테고리 | 가이드 |
| PK 전략 | - 단일 리더: BIGINT GENERATED …; 다중 리더: uuid_generate_v7() |
| 데이터형 | - 화폐·지표는 BIGINT × 스케일; 타임스탬프는 TIMESTAMPTZ 기본 |
| 인덱스 | - fillfactor 70–90 → HOT 확률↑ - JSONB 대량 쓰기 후 VACUUM; 검색은 GIN (fastupdate=off) |
| 스토리지 | - 중간 크기 LOB 많으면 toast_tuple_target 4 k 조정 |
| 파티셔닝 | - RANGE/LIST/ HASH 혼용 가능. 파티션 수 증가 시 플래너 ms 확인 |
| 락/동시성 | - autovacuum_freeze_max_age는 업타임에 맞게 하향 조정 |
| 온라인 DDL | - REINDEX CONCURRENTLY(지표 ↑ 시), ALTER TABLE … ADD COLUMN은 11+ 빠른 패스 |
| 복제/HA | - Standby → promote 후 시퀀스 setval() 검증; 논리 복제면 SEQUENCE 포함 여부 확인 |
| 모니터링 | - pg_stat_user_indexes(bloat) + total_plan_time(플래너) |
3. MySQL InnoDB Cluster 체크리스트
| 카테고리 | 가이드 |
| PK 전략 | - AUTO_INCREMENT + innodb_autoinc_lock_mode=2 (Interleaved) |
| 데이터형 | - 금액은 DECIMAL(18,4); ROW_FORMAT=DYNAMIC + KEY_BLOCK_SIZE 8k 로 압축 실험 |
| 인덱스 | - PK는 짧고 단조 증가; 보조 인덱스 설계 시 PK 중복 컬럼 제외 |
| 스토리지 | - 클러스터드 구조이므로 PK 폭이 곧 페이지 크기와 동일—모니터 필수 |
| 파티셔닝 | - HASH/RANGE, 파티션 컬럼은 PK 선행 키 이어야 Pruning |
| 락/동시성 | - 범위 업데이트 많으면 고카디널리티 인덱스 만들어 Gap Lock 최소화 |
| 온라인 DDL | - ALTER TABLE … ALGORITHM=INPLACE, LOCK=NONE (제약 변경 시 rebuild 가능성) |
| 복제/HA | - FK 생성 시 referenced 테이블에 UNIQUE/PK 없으면 에러 6125 발생 |
| 모니터링 | - performance_schema.replication_applier_status_by_worker(Lag), information_schema.INNODB_TABLESTATS(bloat) |
4. PostgreSQL ↔ MySQL
| 목록 | PostgreSQL | MySQL InnoDB |
| 데이터 저장 | Heap(페이지) + MVCC | PK Clustered B-Tree |
| HOT Update | ✅ | ❌ |
| Gap Lock | ❌ | ✅ |
| Auto-inc 대기 | 시퀀스 독립 | Lock Mode 2로 완화 |
| 온라인 REINDEX | REINDEX CONCURRENTLY | OPTIMIZE TABLE(rebuild) |
| 파티션 많을 때 | 플래너, 메모리 급증 | 별도 제약 없음(관리 복잡) |
오늘은 여기까지~
728x90
'IT 여러가지' 카테고리의 다른 글
| RDBMS: FOREIGN KEY (1) | 2025.11.28 |
|---|---|
| IT: DBA? (1) | 2025.09.13 |
| IT: for Loop vs while Loop (0) | 2025.07.13 |
| IT: RDBMS 스타스키마 (1) | 2025.07.09 |
| IT: RDBMS 반정규화 (2) | 2025.07.08 |