sql >> Database >  >> RDS >> Mysql

Is Mysql UUID_SHORT() vergelijkbaar met UUID()

uuid_short() produceert een bitsgewijze conglomeratie van de server-ID, een redelijk statische tijdcomponent en een opeenvolgend toenemend 24-bits geheel getal. Deze bits worden in een geheel getal van 8 bytes gestopt. De tijdcomponent is gebaseerd op de opstarttijd van de server.

uuid() produceert hexadecimale tekenreeks die een 16 byte version1 UUID vertegenwoordigt. Versie 1 UUID's zijn een bitsgewijze conglomeraat van de server-ID, de huidige tijdstempel, een paar bytes die een rol gaan spelen als je ID's op hoge snelheid genereert, en een paar hulpprogramma-bits.

Om je vraag te beantwoorden:doet uuid_short bieden tijd en ruimte uniciteit die wedijvert met uuid ? Het antwoord is nee. Voorbeeld, de server-ID in een uuid_short is slechts één byte. Dus als je 256 of meer servers hebt, zullen er minstens een paar dezelfde node-ID hebben, wat betekent dat je de unieke ruimte verliest. Ter vergelijking:de server-ID in versie 1 UUID is 6 bytes lang, waardoor de kans op duplicaten voor iedereen behalve de grootste zakelijke serverfarms effectief wordt verkleind :)

Een betere vraag is of uuid_short is goed genoeg. U kunt ID-botsingen zien als u:

  1. Genereer in korte tijd meer dan 16 miljoen IDS vanaf dezelfde server. ***
  2. Start servers met dezelfde server-ID allemaal op exact hetzelfde moment op en deel gegevens tussen hen.
  3. Speel wat met de systeemklok en start vervolgens je server opnieuw op.

Het tweede probleem lijkt voor de meeste mensen onwaarschijnlijk, maar het eerste is het onderzoeken waard voordat u zich ertoe verbindt uuid_short te maken de basis van uw sleutels.

*** Gebaseerd op de mysql-documenten voor uuid_short , lijkt het alsof u botsingen zou zien als u meer dan 16 miljoen ID's zou genereren tijdens de uptime van een enkele server. Maar dat zou dom zijn. De mysql-documenten gaan verder met te zeggen dat het goed gaat zolang je geen 16 miljoen ID's per seconde genereert. Dat houdt in dat ze sommige bits in tijdstempel moeten stoten als je de 16 miljoen opeenvolgende ID's opgebruikt. Ik heb dit niet getest.



  1. Ik krijg veel select @@session.tx_read_only, zou iemand hetzelfde doen?

  2. TIMESTAMP() Voorbeelden – MySQL

  3. Sla nieuwe positie van RecyclerView-items op in SQLite nadat ze zijn gesleept en neergezet

  4. Toon "Geen overeenkomsten gevonden" of verberg DIV-resultaten (AJAX &MySQL)