Store-UUID v4 in MySQL
Ich bin Generierung von UUIDs mit PHP, pro die Funktion gefunden hier
Nun will ich speichern, die in einer MySQL-Datenbank. Was ist die beste/effizienteste MySQL-Feld " format für die Speicherung von UUID-v4?
Momentan habe ich den Datentyp varchar(256), aber ich bin mir ziemlich sicher, dass die viel größer als notwendig. Ich habe festgestellt, viele fast-Antworten, aber Sie sind in der Regel mehrdeutig, über welche form von UUID, die Sie sich beziehen, so bitte ich um die spezifischen format.
wenn Sie nur zufällige Token von einer Art, Sie brauchen keine uuid bei allen. ein varchar256 nicht 256 bytes, so 'zu groß' ist wahrscheinlich nicht, dass große Sache.
Sie brauchen nicht die uuid-nichts für, dass. Nur zufällige bytes. Sie können speichern Sie Sie als hex oder was auch immer. php.net/manual/en/function.random-bytes.php
Holen Sie sich einen 16-random bytes. Speichern als hex. Das ist es. Vergessen Sie nicht, zu werfen, aus der db-sobald die Anmeldung erfolgt ist. Oh, und übergeben als get-request, wie die Antwort suggeriert, denn das ist verrückt.
MySQL bietet die Funktion
Das ist ein UUID1.
Sie brauchen nicht die uuid-nichts für, dass. Nur zufällige bytes. Sie können speichern Sie Sie als hex oder was auch immer. php.net/manual/en/function.random-bytes.php
Holen Sie sich einen 16-random bytes. Speichern als hex. Das ist es. Vergessen Sie nicht, zu werfen, aus der db-sobald die Anmeldung erfolgt ist. Oh, und übergeben als get-request, wie die Antwort suggeriert, denn das ist verrückt.
MySQL bietet die Funktion
UUID()
so brauchen Sie nicht PHP zu generieren. Sie können Bindestriche entfernen und speichern Sie die hex-Zahl als binary(16)
. Wenn Sie es über trigger, es ist SELECT UNHEX(REPLACE(UUID(), '-', ''));
machen es unique
wenn Sie den index, Gewinn.Das ist ein UUID1.
random_bytes
ist aus der OS CSPRNG das ist, was Sie wollen, in diesem Fall.InformationsquelleAutor Stephen R | 2017-03-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Speichern Sie es als
VARCHAR(36)
wenn Sie schauen, um eine genaue Passform, oderVARCHAR(255)
die gehen, um die Arbeit mit der gleichen storage-Kosten sowieso. Es gibt keinen Grund zur Aufregung über die bytes hier.Erinnern
VARCHAR
Felder sind variable Länge, so die storage-Kosten ist proportional zu, wie viel Daten tatsächlich in Ihnen nicht, wie viel Daten in Ihnen.Speichern Sie es als
BINARY
ist extrem nervig, die Werte sind nicht druckbar und können als Müll bei der Ausführung von Abfragen. Es gibt selten einen Grund für die Verwendung der wörtlichen binäre Darstellung. Lesbare Werte kopieren-einfügen, und arbeitete mit einfach.Einige andere Plattformen, wie Postgres, eine richtige UUID Spalte, die speichert Sie intern in einem kompakteren format, sondern zeigt Sie als Menschen lesbar, so erhalten Sie das beste beider Ansätze.
InformationsquelleAutor tadman
Frage ist, über die Speicherung einer UUID in MySQL.
Seit der version 8.0 von mySQL können Sie
binary(16)
mit automatischer Konvertierung überUUID_TO_BIN/BIN_TO_UUID
Funktionen:https://mysqlserverteam.com/mysql-8-0-uuid-support/
Sich bewusst sein, dass mySQL hat auch eine schnelle Möglichkeit zum erzeugen des UUIDs als primary key:
UUID_TO_BIN/BIN_TO_UUID
Werke für v4 UUID (je nach version).UUID()
erzeugt "weniger als" ein v1 UUID: dev.mysql.com/doc/refman/8.0/en/...Ich möchte darauf hinweisen, das ist eine SEHR schlechte Idee, uuid v4 als Primärschlüssel! Die Konvertierung, diese Funktion ist eigentlich sinnlos. UUID v4 die Zufälligkeit töten performance Ihrer Datenbank.
dieser Artikel behauptet, es kann schneller sein, als ein integer-Schlüssel - qcode.in/ready-to-use-uuid-in-Ihren-nächsten-laravel-app
InformationsquelleAutor Karsten R.
Wenn Sie immer eine UUID für jede Zeile, die Sie speichern könnte es als
CHAR(36)
und speichern 1 byte pro Zeile überVARCHAR(36)
.Aber seien Sie vorsichtig mit
CHAR
es wird immer verbrauchen die gesamte Länge definiert, auch wenn das Feld leer ist. Auch, stellen Sie sicher, verwenden Sie die ASCII-Zeichensatz, wieCHAR
sonst planen für worst-case-Szenario (also 3 Byte pro Zeichen inutf8
, 4 inutf8mb4
)InformationsquelleAutor Mathieu Rey
Effizientesten ist definitiv
BINARY(16)
speichern die vom Menschen lesbaren Zeichen verwendet, über die doppelte Speicherkapazität, und bedeutet größere Indizes und langsamer lookup. Wenn die Daten klein genug ist, dass die Speicherung als text verletzt nicht die Leistung, die Sie wahrscheinlich nicht brauchen UUIDs über langweilig integer-Schlüssel. Die Speicherung von raw ist wirklich nicht so schmerzhaft wie andere sagen, weil jeder anständige db-admin-tool angezeigt wird/dump die Bytes als hexadezimale, eher als literal Byte "text". Sie sollten nicht brauchen, um zu suchen bis Uuid manuell in die db, wenn SieHEX()
undx'deadbeef01'
Literale sind deine Freunde. Es ist trivial zu schreiben, die eine Funktion in Ihre app – wie die, die Sie verwiesen–, um sich mit diesem für Sie. Wahrscheinlich könnten Sie auch tun es in der Datenbank als virtuelle Spalten und gespeicherte Prozeduren, damit die app nie stört mit den raw-Daten.Ich würde trennen Sie die Generierung der UUID Logik aus der Anzeige-Logik, um sicherzustellen, dass die bestehenden Daten werden nicht verändert und Fehler sind nachweisbar:
Edit: Wenn Sie nur die Spalte ziemlich beim Lesen der Datenbank, eine Aussage wie die folgende ist ausreichend:
InformationsquelleAutor Walf
Den meisten Speicherplatz-effizienter wäre
BINARY(16)
oder zweiBIGINT UNSIGNED
.Den ehemaligen könnte Ihnen Kopfschmerzen, weil die manuelle Abfragen nicht (auf einfache Weise) geben Sie lesbar/kopierbar Werte.
Letzteres könnte Ihnen Kopfschmerzen, weil er auf der Karte zwischen einem Wert und zwei Spalten.
Wenn dies ein Primärschlüssel ist, würde ich definitiv nicht verschwenden keinen Platz auf, es wird Teil eines jeden sekundären index als gut. In anderen Worten, ich würde einen dieser Typen.
Für die Leistung, die die Zufälligkeit der zufällige UUIDs (d.h. UUID v4, die randomisiert) wird schwer verletzt. Dies gilt, wenn die UUID ist Ihre primary key-oder wenn Sie eine Menge von range-queries auf. Ihre Insertionen in den primären index wird auf der ganzen Linie, anstatt alle auf (oder nahe) den Ende. Ihre Daten verliert, die zeitliche Lokalität, das war eine nützliche Eigenschaft, die in verschiedenen Fällen.
Meine wichtigste Verbesserung wäre die Verwendung etwas ähnlich wie eine UUID v1, verwendet einen Zeitstempel als Bestandteil der Daten und sicherzustellen, dass die Zeitstempel in den höchsten bits. Zum Beispiel die UUID bestehen möglicherweise so etwas wie dieses:
Diese Weise erhalten wir eine Lokalität, ähnlich wie auto-Inkrement-Werte.
InformationsquelleAutor Timo