MySQL, MariaDB

[MySQL] MySQL에서 기본키로 UUID를 선택했을 때의 장단점 및 특징

SungWookKang 2023. 10. 20. 15:18
반응형

[MySQL] MySQL에서 기본키로 UUID를 선택했을 때의 장단점 및 특징

 

l  Version : MySQL PXC 8.0.X

 

MySQL UUID에 대해서 알아보고 테이블의 기본키로 사용하는 방법 및 UUID를 기본키로 했을 때의 장단점에 대해서 알아본다.

 

UUIDuniversally 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

반응형