sql >> Databáze >  >> RDS >> Mysql

Je Mysql UUID_SHORT() srovnatelný s UUID()

uuid_short() vytváří bitovou konglomeraci ID serveru, poměrně statickou časovou složku a postupně se zvyšující 24bitové celé číslo. Tyto bity jsou nacpané do 8bajtového celého čísla. Časová složka je založena na době spuštění serveru.

uuid() vytvoří hex řetězec, který představuje 16bajtový UUID verze1. UUID verze 1 jsou bitovou konglomerací ID serveru, aktuálního časového razítka, několika bajtů, které vstupují do hry, pokud generujete ID při vysoké rychlosti, a několika užitečných bitů.

Odpověď na vaši otázku:dělá uuid_short poskytují časovou a prostorovou jedinečnost, která konkuruje uuid ? Odpověď je ne. Příkladem je ID serveru v uuid_short je pouze jeden bajt. Pokud tedy máte 256 nebo více serverů, alespoň několik z nich bude mít stejné ID uzlu, což znamená, že ztratíte prostorovou jedinečnost. Pro srovnání, ID serveru ve verzi 1 UUID je 6 bajtů dlouhé, což účinně snižuje šanci na duplikáty pro všechny kromě největší podnikové serverové farmy :)

Lepší otázka je, zda uuid_short je dost dobrý. Kolize ID můžete vidět, pokud:

  1. Vygenerujte více než 16 milionů IDS ze stejného serveru v krátkém čase. ***
  2. Spouštějte všechny servery se stejným ID serveru přesně ve stejnou dobu a sdílejte mezi nimi data.
  3. Pohrajte si se systémovými hodinami a poté restartujte server.

Druhý problém se většině lidí zdá nepravděpodobný, ale ten první stojí za to prozkoumat, než se zavážete k vytvoření uuid_short základ vašich klíčů.

*** Na základě dokumentů mysql pro uuid_short , zdá se, že byste viděli kolize, pokud byste během provozu jednoho serveru vygenerovali více než 16 milionů ID. Ale to by bylo hloupé. Dokumenty mysql dále říkají, že jste v pořádku, pokud nevygenerujete 16 milionů ID za sekundu. To znamená, že pokud vyčerpáte 16 milionů sekvenčních ID, musí narazit na některé bity v časovém razítku. Toto jsem netestoval.



  1. Nezdá se, že by kaskáda Doctrine2.3 a OneToOne fungovala

  2. Výsledky SSMS do mřížky - CRLF není zachováno při kopírování/vkládání - nějaké lepší techniky?

  3. Varování:mysqli_error() očekává přesně 1 parametr, zadaná 0

  4. Jak mohu do tabulky přidat omezení ON DELETE?