- UUID는 데이터베이스 테이블 기본 키로 자주 사용됨
- 생성하기 쉽고 분산 시스템 간에 공유하기 쉬우며 고유성을 보장
- UUID의 크기를 고려할 때 이것이 올바른 선택인지 의문이 들지만, 우리가 결정할 수 없는 경우가 많음
- 이 글은 "UUID가 키에 적합한 형식인가"에 초점을 맞추지 않고 PostgreSQL에서 UUID를 기본 키로 효율적으로 사용하는 방법에 대해 설명
PostgreSQL와 UUID를 기본 키로 사용하기
- UUID란?
- UUID는 데이터베이스 테이블의 기본 키로 자주 사용됨
- 분산 시스템 간에 쉽게 공유 가능하며 고유성을 보장함
- UUID의 크기 때문에 적합한지 의문이 들 수 있지만, 선택의 여지가 없는 경우가 많음
PostgreSQL에서 UUID 데이터 타입
-
UUID를 문자열로 저장
- PostgreSQL은 문자열을 저장하기 위한
text데이터 타입을 제공함 - 그러나
text타입은 UUID를 저장하기에 적합하지 않음 - PostgreSQL은 UUID를 위한 전용 데이터 타입
uuid를 제공함 uuid타입은 128비트 데이터 타입으로, 하나의 값을 저장하는 데 16바이트가 필요함text타입은 1 또는 4바이트의 오버헤드가 추가됨
- PostgreSQL은 문자열을 저장하기 위한
-
실험 결과
- 두 개의 테이블을 생성하여 비교: 하나는
text타입, 다른 하나는uuid타입 - 10,000,000개의 행을 삽입한 후 테이블 크기와 인덱스 크기를 비교
text타입을 사용하는 테이블은 54% 더 크고, 인덱스 크기는 85% 더 큼
- 두 개의 테이블을 생성하여 비교: 하나는
UUID와 B-Tree 인덱스
-
B-Tree 인덱스와 UUID
- 랜덤 UUID는 B-Tree 인덱스에 적합하지 않음
- B-Tree 인덱스는 순서가 있는 값과 잘 작동함
- Java의
UUID.randomUUID()는 UUID v4를 반환하며, 이는 의사 랜덤 값임 - UUID v7은 시간 순서대로 정렬된 값을 생성하여 B-Tree 인덱스에 적합함
-
UUID v7 사용
- Java에서 UUID v7을 사용하려면
java-uuid-generator라이브러리가 필요함 - UUID v7을 생성하면 삽입 성능이 향상될 수 있음
- Java에서 UUID v7을 사용하려면
UUID v7이 INSERT 성능에 미치는 영향
- 실험
- UUID v7을 사용하는 테이블을 생성하고, 10,000개의 행을 10번 삽입하여 성능을 측정
- 결과는 다소 무작위적이지만, UUID v7을 삽입하는 것이 약 2배 더 빠름
추가 읽을거리
- PostgreSQL 17에서 UUID v7이 네이티브로 지원될 가능성 있음
- UUID v7 형식에 대한 정보
- UUID가 데이터베이스 기본 키로서의 성능에 미치는 영향
요약
-
UUID의 길이 문제
- 최적화가 이루어져도 UUID는 기본 키로서 최적의 타입이 아님
- 선택의 여지가 있다면 TSID와 같은 다른 옵션을 고려할 것
-
최적화 필요성
- 대규모 데이터셋이나 높은 트래픽이 예상된다면 최적화를 고려해야 함
- 기본 키 변경은 어려운 작업이므로 처음부터 올바르게 설정하는 것이 중요함
-
주의사항
- 필자는 PostgreSQL 전문가가 아니며, 배운 내용을 공유하는 것임
- 유용했다면 댓글이나 트위터를 통해 피드백을 주길 바람
GN⁺의 정리
- 이 글은 PostgreSQL에서 UUID를 기본 키로 사용할 때의 효율적인 방법을 다룸
- UUID v7을 사용하면 삽입 성능이 향상될 수 있음을 실험을 통해 보여줌
- 대규모 데이터셋이나 높은 트래픽이 예상되는 경우 최적화가 필요함
- TSID와 같은 다른 옵션도 고려해볼 만함