Basierend auf der Antwort auf die Frage, die UUID-Leistung in MySQL , schlägt die Person, die antwortet, vor, die UUID als Zahl und nicht als Zeichenfolge zu speichern. Ich bin mir nicht so sicher, wie es gemacht werden kann. Könnte mir jemand etwas vorschlagen? Wie geht mein Ruby-Code damit um?
76
Antworten:
Wenn ich das richtig verstehe, verwenden Sie UUIDs in Ihrer Primärspalte? Die Leute werden sagen, dass ein regulärer (ganzzahliger) Primärschlüssel schneller ist, aber es gibt eine andere Möglichkeit, die dunkle Seite von MySQL zu nutzen. Tatsächlich verwendet MySQL Binärdateien schneller als alles andere, wenn Indizes erforderlich sind.
Da die UUID 128 Bit beträgt und hexadezimal geschrieben ist, ist es sehr einfach, die UUID zu beschleunigen und zu speichern.
Entfernen Sie zunächst in Ihrer Programmiersprache die Bindestriche
Von
110E8400-E29B-11D4-A716-446655440000
bis110E8400E29B11D4A716446655440000
.Jetzt sind es 32 Zeichen (wie ein MD5-Hash, mit dem dies auch funktioniert).
Da eine Single
BINARY
in MySQL 8 Bit großBINARY(16)
ist, entspricht sie der 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 erneut ein, um sie an Ihre ursprüngliche UUID anzupassen. 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 einer beliebigen Hex-Zeichenfolge verwenden möchten, verwenden Sie immer
length / 2
die Feldlänge. Für einen sha512 wäre das Feld also,BINARY (64)
da eine sha512-Codierung 128 Zeichen lang ist.quelle
110E8400-E29B-11D4-A716-446655440000
. Tun Sie einfach etwas wie:SELECT * FROM test_table WHERE field_binary LIKE CONCAT("%", UNHEX('110E8400E29B11D4A716446655440000'), "%")
WHERE Field = UNHEX('110E8400E29B11D4A716446655440000')
. Anstatt zu tunWHERE Field = 3
oder was auch immer, schließen Sie das Feld mit UNHEX ein, wenn Sie eine Hex-Zeichenfolge verwenden (zum Suchen, Einfügen, Wo, Aktualisieren, Löschen usw.), und Sie schließen das Feld mit HEX ein, wenn Sie aus MySQL lesen möchten (wählen).Der Percona-Blog enthält einen Artikel (der Benchmarks enthält), der auf Ihre Frage antwortet: Speichern Sie die UUID auf optimierte Weise .
quelle
Ich denke nicht, dass es eine gute Idee ist, eine Binärdatei zu verwenden.
Angenommen, Sie möchten einen Wert abfragen:
SELECT HEX(field_binary) AS field_binary FROM `test_table`
Wenn wir mehrere Werte zurückgeben, rufen wir die HEX-Funktion mehrmals auf.
Das Hauptproblem ist jedoch das nächste:
SELECT * FROM `test_table` where field_binary=UNHEX('110E8400E29B11D4A716446655440000')
Wenn Sie eine Funktion innerhalb des Where verwenden, wird der Index einfach ignoriert.
Ebenfalls
SELECT * FROM `test_table` where field_binary=x'skdsdfk5rtirfdcv@#*#(&#@$9'
Könnte zu vielen Problemen führen.
quelle