Memorizzazione MySQL GUID / UUID
Domanda
Questo è il modo migliore che potrei fornire convertire un MySQL GUID / UUID generato da UUID () per un binario (16):
UNHEX(REPLACE(UUID(),'-',''))
E poi riporlo in un BINARIO (16)
Ci sono implicazioni di farlo in questo modo che dovrei sapere di?
Soluzione
Non molte implicazioni. Si rallenta le query un po ', ma sarà difficile accorgersene.
UNIQUEIDENTIFIER
viene memorizzato come 16-byte binary
internamente in ogni caso.
Se avete intenzione di caricare il file binario in un client e analizzare lì, prendere nota del bit order
, può avere altra rappresentazione di stringa del NEWID()
iniziale.
funzione Oracle
di SYS_GUID()
è incline a questo problema, la conversione di una stringa dà risultati diversi sul client e sul server.
Altri suggerimenti
Da MySQL 8.0 e superiori è possibile utilizzare UUID_TO_BIN :
UUID_TO_BIN (string_uuid) , UUID_TO_BIN (string_uuid, swap_flag)
Converte un UUID stringa in un UUID binario e restituisce il risultato. (La descrizione della funzione IS_UUID () elenca i formati di stringa UUID consentiti.) L'UUID binario di ritorno è un valore VARBINARY (16).
CREATE TABLE t (id binary(16) PRIMARY KEY);
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
INSERT INTO t VALUES(UUID_TO_BIN(UUID(), true));
SELECT *, BIN_TO_UUID(id) FROM t;
Vorrei hash in un numero intero a 8 byte e memorizzare il numero intero utilizzando un algoritmo di hash unidirezionale a basso collisione ad alta efficienza come MurmurHash64A. Questo utilizza molto meno spazio e può essere indicizzato e / o partizionato su. C'è un progetto SourceForge che include funzioni Memcached for MySQL ( http: // forgia. mysql.com/projects/project.php?id=250 ) che potrebbe includere MurmurHash64A, dal momento Memcached lo usa, ma non so. O guardare questa implementazione di FNV per MySQL: http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/