일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- docker
- 누적합
- 프로그래머스
- 이분탐색
- 깊게 생각해보기
- 쿠키
- 완전탐색
- piplining
- branch 전략
- 숫자 블록
- prg 패턴
- jwt 표준
- 백준
- 좋은 코드 나쁜 코드
- 디버깅
- 알람 시스템
- 결제서비스
- BFS
- AWS
- 코드 계약
- 카카오
- 검색어 추천
- 레디스 동시성
- 트랜잭샨
- 수신자 대상 다르게
- gRPC
- 객체지향패러다임
- 셀러리
- 구현
- spring event
- Today
- Total
코딩관계론
최적의 PK를 찾아서 본문
PK전략 정의
PK(Primary Key) 전략은 데이터베이스 성능에 큰 영향을 미치는 중요한 요소입니다. PK 값으로 클러스터링 인덱스가 생성되며, 이는 데이터가 물리적으로 정렬되어 저장되는 것을 의미합니다. 잘못된 PK를 설정하면 성능 저하가 발생할 수 있습니다
2024.07.03 - [개발/Java] - 클러스터링과 논클러스트링이란?.
왜 PK 전략이 중요한가?
- 클러스터링 인덱스 효과: PK 값에 의해 데이터가 물리적으로 정렬됩니다.
- 성능 최적화: 필드를 업데이트하거나 저장할 때 효율적으로 접근할 수 있습니다.
- 잘못된 PK 설정의 위험: 비효율적인 PK는 데이터베이스 성능에 부정적인 영향을 미칠 수 있습니다.
또한 자연키보단 대체키를 이용해 PK를 설정하도록 합니다. PK의 특징을 보면 절대 수정이 되면 안되는데, 자연키를 가지고 가게 되면 어떤 방식으로든 수정이 될 수가 있기 때문이다.
대체키의 종류 및 특징
UUID
전역적으로 유일함이 보장되지만, UUID 버전 4의 경우 완전 랜덤한 값이 생성되어 빈번한 정렬 및 인덱스 페이지 재구성 발생하게 됩니다. 이를 보안하기 위한 방법으론 K-Sortable UID (KSUID), COMB (Combined) UUID가 있습니다.
Auto Increment
데이터의 삽입 시 값이 하나씩 증가됨으로, 삽입 순서대로 정렬됨으로 정렬에 소요되는 시간이 없습니다. 하지만 분산 시스템 환경에서는 PK중복으로 인해서 사용할 수 없습니다.
Sequence Number
데이터베이스에서 제공하는 스퀸스를 사용하여 고유 값을 생성합니다. 삽입 순서대로 정렬됨으로 정렬에 소요되는 시간이 없고, 분산 환경에서도 고유 값이 생성가능합니다. 하지만 Sequece 테이블에 다수의 사용자가 요청을 하게 되면 lock이 걸리게 됨으로 추가적인 시간이 소요됩니다.
그럼 무엇을 선택해야 할까?
저는 KSUID를 선택하게 됐습니다. 아래는 성능을 테스트한 표인데, KSUID가 근소하게 더 빠른 면이 있었고, 분산처리 환경에서도 전역적인 고유성을 보장함으로써 나중에 scale-out을 통해서 실행했을 때도 sequence table의 병목을 해결할 수 있을 것 같았습니다.
'개발' 카테고리의 다른 글
Redis가 제안한 분산락(feat.Redlock) (0) | 2024.07.31 |
---|---|
타임딜 서비스 개발기 (2) | 2024.07.25 |
Git Branch 관리 전략 (0) | 2024.07.17 |
객체지향이란 무엇인가 (0) | 2024.06.01 |
ProtoBuf (Protocol Buffer, 프로토콜 버퍼) (0) | 2023.07.27 |