MySQL UUID

UUID
UUID(universally unique identifier)는 128비트 식별자입니다. 분산된 환경에서 고유한 식별자를 위해 특정 서버에 의존하지 않고, 매우 높은 확률로 중복되지 않는 식별자를 만들 수 있습니다.
이렇게 생성하면 다음과 같은 장점들이 있습니다.
- 서버를 거치거나 외부 통신 없이 고유한 식별자를 생성할 수 있습니다.
- 값이 증가하거나 패턴이 있지 않아 ID를 추측해 처리하는 접근이 어려워집니다.
반면 단점으로는 식별자를 저장하기 위해 128비트를 저장해야하는 문제가 있습니다.
UUID를 만들 때는 각 언어에서 지원하는 UUID 생성 방법을 통해 만들 수 있습니다.
예시로 mysql에서 만드는 방법입니다.
select uuid()
java에서 만든다면 UUID.randomUUID()
로 만들 수 있으며 구현은 다음과 같습니다.
public static UUID randomUUID() {
SecureRandom ng = Holder.numberGenerator;
byte[] randomBytes = new byte[16];
ng.nextBytes(randomBytes);
randomBytes[6] &= 0x0f; /* clear version */
randomBytes[6] |= 0x40; /* set to version 4 */
randomBytes[8] &= 0x3f; /* clear variant */
randomBytes[8] |= 0x80; /* set to IETF variant */
return new UUID(randomBytes);
}
MySQL에서 저장할 때
UUID가 128비트 식별자라고 했지만 실제 글자 수는 36글자로 '-' 문자 4개로 구분되어 있습니다.
aab5d5fd-70c1-11e5-a4fb-b026b977eb28
그대로 MySQL에 저장하는 경우 36글자를 차지하게 되는데 char
이나 binary
처럼 문자열 타입에 저장합니다.
char
와 binary
는 모두 문자를 저장하지만 binary의 경우는 바이트를 저장할 때 주로 쓰입니다.
UUID에서의 문자도 16진수형 숫자들의 문자이므로 char
보다 binary
로 바이트 형태로 저장하는 것이 더 어울립니다.
'-' 문자는 식별하는데 도움이 되지 않기 때문에 이 값을 빼고 저장하면 32글자, 16바이트로 압축할 수 있습니다.
이처럼 UUID값을 binary(16) 형태로 변환할 때, MySQL 8.0에서는 UUID_TO_BIN()
함수를 제공합니다.
반대로 압축된 바이너리 값을 UUID 형태로 반환할 때는 BIN_TO_UUID()
함수를 사용하면 됩니다.
참조
https://dev.mysql.com/blog-archive/mysql-8-0-uuid-support/
https://dev.mysql.com/blog-archive/storing-uuid-values-in-mysql-tables/