sql >> Database >  >> RDS >> Mysql

MySQL PRIMAIRE SLEUTELS:UUID / GUID vs BIGINT (tijdstempel + willekeurig)

Ik ben in mijn professionele leven tegen dit probleem aangelopen. We gebruikten tijdstempel + willekeurig getal en kwamen serieuze problemen tegen toen onze applicaties opschaalden (meer clients, meer servers, meer verzoeken). Toegegeven, we gebruikten (domweg) slechts 4 cijfers en veranderden toen in 6, maar het zou je verbazen hoe vaak de fouten nog steeds voorkomen.

Over een periode die lang genoeg is, bent u gegarandeerd om dubbele sleutelfouten te krijgen. Onze applicatie is bedrijfskritisch en daarom was zelfs de kleinste kans dat het zou mislukken vanwege inherent willekeurig gedrag onaanvaardbaar. We zijn begonnen met het gebruik van UUID's om dit probleem te voorkomen en hebben het maken ervan zorgvuldig beheerd.

Als u UUID's gebruikt, neemt uw indexgrootte toe en een grotere index resulteert in slechtere prestaties (misschien onmerkbaar, maar niettemin slechter). MySQL ondersteunt echter een native UUID-type (gebruik nooit varchar als primaire sleutel!!), en kan indexeren, zoeken, enz. behoorlijk efficiënt afhandelen, zelfs in vergelijking met bigint. De grootste prestatiehit voor uw index is bijna altijd het aantal geïndexeerde rijen, in plaats van de grootte van het item dat wordt geïndexeerd (tenzij u wilt indexeren op een lange tekst of iets dergelijks belachelijks).

Om je vraag te beantwoorden:Bigint (met bijgevoegde willekeurige getallen) is oké als je niet van plan bent om je applicatie/service aanzienlijk te schalen. Als uw code de wijziging zonder veel wijzigingen aankan en uw toepassing niet explodeert als er een dubbele sleutelfout optreedt, ga er dan mee akkoord. Anders, bijt-the-bullet en ga voor de meer substantiële optie.

Je kunt later altijd een grotere wijziging doorvoeren, zoals overschakelen naar een geheel andere backend (waar we nu mee te maken hebben... :P)



  1. Een database ontwerpen voor een online banenportaal

  2. Hoe u de roosters van werknemers in een database kunt opslaan

  3. Rails en PostgreSQL:rol postgres bestaat niet

  4. KENNISGEVINGEN uitschakelen in psql-uitvoer