Speichern von MySQL GUID / UUID
Frage
Dies ist der beste Weg, ich einfiel einen MySQL GUID / UUID von UUID () in einem binären (16) erzeugt konvertieren:
UNHEX(REPLACE(UUID(),'-',''))
Und dann ist es in einem binären Speichern (16)
Gibt es irgendwelche Auswirkungen es auf diese Art und Weise zu tun, die ich kenne soll?
Lösung
Nicht viele Auswirkungen. Es wird die Abfragen etwas verlangsamen, aber Sie werden es kaum bemerken.
UNIQUEIDENTIFIER
als 16-byte binary
gespeichert wird intern sowieso.
Wenn Sie die binären in einen Client laden gehen und dort zu analysieren, notieren Sie die bit order
, kann es andere String-Darstellung hat als die anfänglichen NEWID()
.
Oracle
die SYS_GUID()
Funktion ist für dieses Problem anfällig, es in einen String konvertieren unterschiedliche Ergebnisse auf dem Client gibt und auf dem Server.
Andere Tipps
Von MySQL 8.0 und höher Sie UUID_TO_BIN :
UUID_TO_BIN (string_uuid) , UUID_TO_BIN (string_uuid, swap_flag)
Wandelt einen String UUID in eine binäre UUID und gibt das Ergebnis. (Die IS_UUID () Funktion Beschreibung listet die zulässigen Formate Zeichenfolge UUID). Die Rückkehr binäre UUID ist ein VARBINARY (16) Wert.
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;
ich würde es in eine Hash-8-Byte-Ganzzahl und speichere die ganze Zahl mit einem niedrigen Kollisionshocheffizienten Einweg-Hash-Algorithmus wie MurmurHash64A verwenden. Dies nutzt viel weniger Platz und kann auf indiziert und / oder aufgeteilt werden. Es ist ein Projekt, das Source MemCached Funktionen für mySQL ( http umfasst: // Schmiede. mysql.com/projects/project.php?id=250 ), die möglicherweise MurmurHash64A enthalten, da Memcached verwendet es, aber ich weiß es nicht. Oder schauen Sie sich diese Implementierung von FNV für mySQL: http://www.xaprb.com/blog/2008/03/09/a-very-fast-fnv-hash-function-for-mysql/