MySQL UUID Smackdown: UUID vs. INT para chave primária

Resumo : Este tutorial apresenta o UUID do MySQL, mostra como usá-lo como chave primária para uma tabela e discute os prós e contras de usá-lo como chave primária.

Introdução ao MySQL UUID

UUID significa Identificador Universalmente Único. UUID é definido com base no RFC 4122 , “um namespace URN de identificador universalmente exclusivo (UUID)”.

O UUID é projetado como um número único globalmente no espaço e no tempo. Espera-se que dois valores UUID sejam distintos, mesmo que sejam gerados em dois servidores independentes.

No MySQL, um valor UUID é um número de 128 bits representado como uma string utf8 de cinco números hexadecimais no seguinte formato:

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Para gerar um valor UUID, você usa a UUID()função da seguinte forma:

UUID()Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

A UUID()função retorna um valor UUID em conformidade com a versão 1 do UUID descrita na RFC 4122.

Por exemplo, a instrução a seguir usa a UUID()função para gerar um valor UUID:

SELECT UUID();

Saída:

+--------------------------------------+
| UUID()                               |
+--------------------------------------+
| e5f96fc2-a700-11ee-9e18-0a0027000003 |
+--------------------------------------+
1 row in set (0.04 sec)Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

MySQL UUID vs. Auto-Increment INT como chave primária

Prós

Usar UUID para uma chave primária tem as seguintes vantagens:

  • Os valores UUID são exclusivos em tabelas, bancos de dados e até mesmo em servidores que permitem mesclar linhas de bancos de dados diferentes ou distribuir bancos de dados entre servidores.
  • Os valores UUID não expõem as informações sobre seus dados, portanto, são mais seguros para uso em uma URL. Por exemplo, se um cliente com ID 10 acessa sua conta via http://www.example.com/customers/10/URL, é fácil adivinhar que existe um cliente 11, 12, etc., e este pode ser alvo de um ataque.
  • Os valores UUID podem ser gerados em qualquer lugar, o que pode ajudar a evitar uma viagem de ida e volta ao servidor de banco de dados. Também simplifica a lógica do aplicativo. Por exemplo, para inserir dados em uma tabela pai e em tabelas filho, você deve primeiro inserir na tabela pai, obter o ID gerado e, em seguida, inserir os dados nas tabelas filho. Usando o UUID, você pode gerar o valor da chave primária da tabela pai antecipadamente e inserir linhas nas tabelas pai e filho ao mesmo tempo em uma transação .

Contras

Além das vantagens, os valores UUID também apresentam algumas desvantagens:

  • Armazenar valores UUID (16 bytes) exige mais armazenamento do que números inteiros (4 bytes) ou mesmo números inteiros grandes (8 bytes).
  • A depuração parece ser mais difícil, imagine a expressão WHERE id = 'df3b7cb7-6a95-11e7-8846-b05adad3f0ae' em vez deWHERE id = 10
  • O uso de valores UUID pode causar problemas de desempenho devido ao seu tamanho e à não ordenação.

Solução MySQL UUID

No MySQL, você pode armazenar valores UUID em um formato compacto ( BINARY) e exibi-los em formato legível ( VARCHAR) com a ajuda das seguintes funções:

  • UUID_TO_BIN
  • BIN_TO_UUID
  • IS_UUID

Observe que  UUID_TO_BIN()as  funções BIN_TO_UUID(), e  IS_UUID() estão disponíveis apenas no MySQL 8.0 ou posterior.

A UUID_TO_BIN() função converte um UUID de um formato legível por humanos ( VARCHAR) em um formato compacto (BINÁRIO) para armazenamento e a BIN_TO_UUID()função converte UUID do formato compacto ( BINARY) para um formato legível por humanos ( VARCHAR) para exibição.

A IS_UUID()função retorna 1 se o argumento for um UUID válido em formato de string. Se o argumento não for UUID de formato de string válido, a IS_UUIDfunção retornará 0. Caso o argumento seja NULL, a  IS_UUID()função retornará NULL.

A seguir estão os UUIDs em formato de string válidos no MySQL:

aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
aaaaaaaabbbbccccddddeeeeeeeeeeee
{aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee}Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Exemplos de UUID do MySQL

Vejamos um exemplo de uso de UUID como chave primária.

1) Exemplo básico de UUID do MySQL

Primeiro, crie uma nova tabela chamada customers:

CREATE TABLE customers (
    id BINARY(16) PRIMARY KEY,
    name VARCHAR(255)
);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Segundo, insira valores UUID na idcoluna usando as funções UUID()e UUID_TO_BIN()da seguinte forma:

INSERT INTO customers(id, name)
VALUES(UUID_TO_BIN(UUID()),'John Doe'),
      (UUID_TO_BIN(UUID()),'Will Smith'),
      (UUID_TO_BIN(UUID()),'Mary Jane');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, consulte os dados de uma coluna UUID e use BIN_TO_UUID()a função para converter o formato binário em formato legível por humanos:

SELECT 
    BIN_TO_UUID(id) id, 
    name
FROM
    customers;   Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Saída:

+--------------------------------------+------------+
| id                                   | name       |
+--------------------------------------+------------+
| 6ab66253-a701-11ee-9e18-0a0027000003 | John Doe   |
| 6ab66917-a701-11ee-9e18-0a0027000003 | Will Smith |
| 6ab66b0e-a701-11ee-9e18-0a0027000003 | Mary Jane  |
+--------------------------------------+------------+
3 rows in set (0.01 sec)Linguagem de código:  JavaScript  ( javascript )

2) Usando UUID como valor padrão para a chave primária

Primeiro, crie uma nova tabela chamada vendors:

CREATE TABLE vendors(
    id BINARY(16) DEFAULT (UUID_TO_BIN(UUID())),
    name VARCHAR(255),
    PRIMARY KEY(id)
);Linguagem de código:  PHP  ( php )

Na vendorstabela, usamos o resultado da expressão UUID_TO_BIN(UUID())como valor padrão para a coluna de chave primária. Portanto, não precisamos especificar o valor da idcoluna sempre que inserirmos uma nova linha na tabela.

Segundo, insira uma nova linha na vendorstabela:

INSERT INTO vendors(name)
VALUES('ABC Inc.');Linguagem de código:  JavaScript  ( javascript )

Terceiro, recupere dados de vendors:

SELECT 
    BIN_TO_UUID(id) id, 
    name
FROM
    vendors;   

Saída:

+--------------------------------------+----------+
| id                                   | name     |
+--------------------------------------+----------+
| 2c56abc6-a704-11ee-9e18-0a0027000003 | ABC Inc. |
+--------------------------------------+----------+
1 row in set (0.00 sec)Linguagem de código:  JavaScript  ( javascript )

Neste tutorial, você aprendeu sobre o UUID do MySQL e como usá-lo para a coluna de chave primária.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *