코딩관계론

최적의 PK를 찾아서 본문

개발

최적의 PK를 찾아서

개발자_티모 2024. 7. 25. 14:50
반응형

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