IT 여러가지

IT: RDBMS 테이블 설계 체크리스트

dewstream 2025. 7. 16. 08:00
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