Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie speichere ich uuid als Zahl?

Wenn ich das richtig verstehe, verwenden Sie UUIDs in Ihrer primären Spalte? Die Leute werden sagen, dass ein regulärer (ganzzahliger) Primärschlüssel schneller ist, aber es gibt einen anderen Weg, die dunkle Seite von MySQL zu nutzen. Tatsächlich ist MySQL bei der Verwendung von Binärdateien schneller als alles andere, wenn Indizes erforderlich sind.

Da die UUID 128 Bit lang ist und hexadezimal geschrieben wird, ist es sehr einfach, die UUID zu beschleunigen und zu speichern.

Entfernen Sie zuerst in Ihrer Programmiersprache die Bindestriche

Von 110E8400-E29B-11D4-A716-446655440000 bis 110E8400E29B11D4A716446655440000 .

Jetzt sind es 32 Zeichen (wie ein MD5-Hash, mit dem das auch funktioniert).

Da ein einzelnes BINARY in MySQL ist 8 Bit groß, BINARY(16) hat die Größe einer UUID (8*16 =128).

Sie können einfügen mit:

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

und Abfrage mit:

SELECT HEX(FieldBin) AS FieldBin FROM Table

Fügen Sie nun in Ihrer Programmiersprache die Bindestriche an den Positionen 9, 14, 19 und 24 wieder ein, damit sie mit Ihrer ursprünglichen UUID übereinstimmen. Wenn die Positionen immer unterschiedlich sind, können Sie diese Informationen in einem zweiten Feld speichern.

Vollständiges Beispiel:

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`

Wenn Sie diese Technik mit einem beliebigen Hex-String verwenden möchten, verwenden Sie immer length / 2 für die Feldlänge. Für einen sha512 wäre das Feld also BINARY (64) da eine sha512-Kodierung 128 Zeichen lang ist.