[MySQL] MySQL에서 기본키로 UUID를 선택했을 때의 장단점 및 특징
[MySQL] MySQL에서 기본키로 UUID를 선택했을 때의 장단점 및 특징
l Version : MySQL PXC 8.0.X
MySQL UUID에 대해서 알아보고 테이블의 기본키로 사용하는 방법 및 UUID를 기본키로 했을 때의 장단점에 대해서 알아본다.
UUID는 universally unique Identifier의 약자로 RFC 4122를 기반으로 정의된다. UUID는 공간과 시간에 있어서 전 세계적으로 고유한 숫자로 설계되었다. 두 개의 UUID 값은 두개의 독립적인 서버에 생성되더라도 서로 구별되어야 한다.
MySQL에서 UUID값은 다음 형식의 5개의 16진수 숫자로 구성된 utf8 문자열로 표시되는 128비트 숫자이다.
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee |
UUID 값을 생성하려면 UUID() 함수를 사용하며, RFC 4122에 설명된 UUID 버전1에 따라 UUID 값을 반환한다.
SELECT UUID() |
기본키에 UUID를 사용하면 다음과 같은 이점이 있다.
l UUID 값은 테이블, 데이터베이스, 심지어 다른 데이터베이스의 행을 병합하거나 서버 간에 데이터베이스를 배포할 수 있는 서버에서도 고유하다.
l UUID 값은 데이터에 대한 정보를 노출하지 않으므로 URL에서 사용하는 것이 더 안전하다. 예를 들어 ID가 10인 고객이 http://www.example.com/customers/10/URL을 통해 자신의 계정에 접속하면 고객 11, 12 등이 있다고 쉽게 추측할 수 있으며 이것이 공격 대상이 될 수 있다.
l UUID 값은 데이터베이스 서버로의 왕복을 피하는 어디에서나 생성될 수 있다. 또한 애플리케이션의 논리를 단순화한다. 예를 들어 상위 테이블과 하위 테이블에 데이터를 삽입하려면 먼저 상위 테이블에 삽입하고 생성된 ID를 가져온 다음 하위 테이블에 데이터를 삽입해야 한다. UUID를 사용하면 상위 테이블의 기본 키 값을 미리 생성하고 트랜잭션 내에서 동시에 상위 테이블과 하위 테이블 모두에 행을 삽입할 수 있다.
하지만 아래와 같은 단점도 존재한다.
l UUID 값(16바이트)을 저장하려면 정수(4바이트) 또는 큰 정수(8바이트)보다 더 많은 저장 공간이 필요하다.
l WHERE id = 'df3b7cb7-6a95-11e7-8846-b05adad3f0ae'처럼 사용해야 해서 디버깅이 어려울 수 있다.
l UUID 값을 사용하면 크기 및 정렬 불가 문제로 인해 성능 문제가 발생할 수 있다.
MySQL에서는 UUID 값을 간단한 형식(BINARY)으로 저장하고 다음 기능을 사용하여 사람이 읽을 수 있는 형식(VARCHAR)으로 표시할 수 있다. 다만 해당 함수는 MySQL 8.0이상에서만 사용할 수 있다.
l UUID_TO_BIN
l BIN_TO_UUID
l IS_UUID
UUID_TO_BIN() 함수는 UUID를 사람이 읽을 수 있는 형식(VARCHAR)에서 압축 포맷(BINARY) 형식으로 변환하여 저장하고, BIN_TO_UUID()는 UUID를 압축 포맷(BINARY) 형식에서 사람이 읽을 수 있는 형식(VARCHAR)으로 변환하여 표시한다.
IS_UUID() 함수는 유효한 문자열 형식 UUID인 경우 함수는 1을 반환한다. 인수가 유효한 문자열 형식 UUID가 아닌 경우 함수는 0을 반환한다. IS_UUID인수가 NULL, IS_UUID()인 경우 함수는 NULL를 반환한다.
다음은 MySQL의 유효한 문자열 형식 UUID이다.
aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee aaaaaaaabbbbccccddddeeeeeeeeeeee {aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee} |
아래 스크립트는 UUID를 기본키로 사용하는 테이블 생성 스크립트이다.
CREATE TABLE customers ( id BINARY(16) PRIMARY KEY, name VARCHAR(255) ); |
id열에 UUID 값을 삽입하려면 다음과 같이 UUID() 및 UUID_TO_BIN()함수를 사용한다.
INSERT INTO customers(id, name) VALUES(UUID_TO_BIN(UUID()),'John Doe'), (UUID_TO_BIN(UUID()),'Will Smith'), (UUID_TO_BIN(UUID()),'Mary Jane'); |
UUID 열에서 데이터를 쿼리하려면 BIN_TO_UUID()함수를 사용하여 이진 형식을 사람이 읽을 수 있는 형식으로 변환한다.
SELECT BIN_TO_UUID(id) id, name FROM customers; |
[참고자료]
l https://www.mysqltutorial.org/mysql-uuid/
2023-10-19 / Sungwook Kang / http://sungwookkang.com
MySQL, MySQL UUID