MySQL
MySQL 사용하기

Primary Key 선택요령

MySQL PK로 INT, UUID 선택 가이드

#MySQL

#DataBase

2022년 02월 03일

토이프로젝트를 진행할때는 고민없이 INT를 고유키로 사용 했습니다.
하지만 큰 서비스 프로젝트를 진행할때 INT를 사용하기엔 무리가 있지 않을까?
대부분 UUID를 사용한다는데 INT를 버리고 UUID를 사용할 경우 어떤 장점이 있을까요?

INT


INT(4Byte) → 2147483648 ~ +2147483647
unsigned INT(4Byte) → 0 ~ 4294967295
BIGINT(8Byte) → 9223372036854775808 ~ 9223372036854775807
unsigned BIGINT(8Byte) → 0 ~ 18446744073709551615

INT 사용시 이점


INT형을 사용할경우 숫자로 표현되어 가독성이 높아 디버깅을 할때 유용합니다
UUID 보다 공간효율성이 높습니다

INT 사용시 단점


다중 서버 인스턴스(샤딩) 운용, 병합할때 중복 처리가 추가로 필요합니다
사용자가 레코드의 ID를 추측할 수 있습니다

UUID


UUID를 그대로 저장하면 36Byte가 필요하나 Mysql의 경우 UUID v1을 사용하기 때문에 타임스탬프를 재배치해 BINARY(16)로 크기를 줄일 수 있습니다

UUID 사용시 이점


다중 서버 인스턴스(샤딩) 운용, 병합할때 중복을 최소화 할 수 있습니다
사용자가 다른 레코드의 ID를 추측할 수 없습니다

UUID 사용시 단점


인덱스 크기가 증가하고 인덱스의 크기가 캐시할 수 있는 크기보다 커져서 하드 디스크를 사용할경우 성능 저하가 심합니다
사용자 친화적이지 않아 디버그를 할때 불편합니다
마지막으로 저장된 데이터를 불러와야하는 경우 UUID를 통해 마지막에 저장된 데이터를 확인할 수 없습니다
테이블 인덱스가 캐시보다 20배 클 경우 5%만 캐시됩니다

상황에 맞는것을 사용하자


대규모 서버 인스턴스를 운용하면서 분산된 데이터베이스에 유니크한 고유키를 발급해야하는경우 UUID를 사용하는것이 좋습니다
자신이 진행하는 프로젝트의 데이터베이스 서버 인스턴스의 성능이 낮고 단일 데이터베이스를 사용할 경우
unsigned INT, unsigned BIGINT를 사용하는것이 좋습니다