Mysql
 sql >> Database >  >> RDS >> Mysql

Come memorizzare uuid come numero?

Se ho capito bene, stai utilizzando UUID nella colonna principale? La gente dirà che una chiave primaria normale (intera) sarà più veloce, ma c'è un altro modo per usare il lato oscuro di MySQL. In effetti, MySQL è più veloce nell'usare il binario di qualsiasi altra cosa quando sono richiesti gli indici.

Poiché l'UUID è a 128 bit ed è scritto come esadecimale, è molto facile velocizzare e memorizzare l'UUID.

Innanzitutto, nel tuo linguaggio di programmazione rimuovi i trattini

Da 110E8400-E29B-11D4-A716-446655440000 a 110E8400E29B11D4A716446655440000 .

Ora sono 32 caratteri (come un hash MD5, con cui funziona anche questo).

Poiché un singolo BINARY in MySQL ha una dimensione di 8 bit, BINARY(16) è la dimensione di un UUID (8*16 =128).

Puoi inserire usando:

INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))

e interroga utilizzando:

SELECT HEX(FieldBin) AS FieldBin FROM Table

Ora nel tuo linguaggio di programmazione, reinserisci i trattini nelle posizioni 9, 14, 19 e 24 in modo che corrispondano al tuo UUID originale. Se le posizioni sono sempre diverse puoi memorizzare quelle informazioni in un secondo campo.

Esempio completo:

CREATE TABLE  `test_table` (
    `field_binary` BINARY( 16 ) NULL ,
    PRIMARY KEY (  `field_binary` )
) ENGINE = INNODB ;

INSERT INTO  `test_table` (
    `field_binary`
)
VALUES (
    UNHEX(  '110E8400E29B11D4A716446655440000' )
);

SELECT HEX(field_binary) AS field_binary FROM `test_table`

Se vuoi usare questa tecnica con qualsiasi stringa esadecimale, esegui sempre length / 2 per la lunghezza del campo. Quindi per uno sha512, il campo sarebbe BINARY (64) poiché una codifica sha512 è lunga 128 caratteri.