sql >> Database >  >> RDS >> Mysql

Wat gebeurt er als ik een door bigint gegenereerde sleutel uitput? Hoe ermee om te gaan?

Het raakt niet op.

De maximale bigint is 9223372036854775807. Bij 1000 inserts/seconde is dat 106751991167 dagen waard. Bijna 300 miljoen jaar, als mijn wiskunde klopt.

Zelfs als je het opsplitst, gebruik je offsets waarbij bijvoorbeeld 100 servers elk een specifiek subbereik van de waarden hebben (x*100+0 ... x*100+99 ), je raakt niet op. 10.000 machines die 100.000 wisselplaten per seconde doen, kunnen u daar in ongeveer drie eeuwen brengen. Dat zijn natuurlijk meer transacties per seconde dan de New York Stock Exchange gedurende honderden jaren solide...

Als je doe de limiet voor de grootte van het gegevenstype van de gegenereerde sleutel overschrijdt, zullen nieuwe invoegingen mislukken. In PostgreSQL (sinds je deze PostgreSQL hebt getagd) met een bigserial je zult zien:

CREATE TABLE bigserialtest ( id bigserial primary key, dummy text );
SELECT setval('bigserialtest_id_seq', 9223372036854775807);
INSERT INTO bigserialtest ( dummy ) VALUES ('spam');

ERROR:  nextval: reached maximum value of sequence "bigserialtest_id_seq" (9223372036854775807)

Voor een gewone serial je krijgt een andere foutmelding, omdat de sequence is altijd 64-bits, dus je zult het punt bereiken waarop je het sleuteltype moet wijzigen in bigint of krijg een foutmelding zoals:

regress=# SELECT setval('serialtest_id_seq', 2147483647);
regress=# INSERT INTO serialtest (dummy) VALUES ('ham');
ERROR:  integer out of range

Als je echt gelooft dat het voor je site mogelijk is om de limiet van een bigint in je applicatie te bereiken, kun je een samengestelde sleutel gebruiken - zeg maar (shard_id, subsleutel) - of een uuid-sleutel.

In een nieuwe applicatie hiermee proberen om te gaan, is voortijdige optimalisatie. Serieus, van een nieuwe applicatie naar dat soort groei, ga je hetzelfde schema gebruiken? Of database-engine? Of zelfs codebase?

U kunt zich net zo goed zorgen maken over GUID-botsingen in systemen met GUID-sleutel. De verjaardagsparadox betekent immers dat GUID-botsingen waarschijnlijker zijn dan je denkt - bij ongelooflijk, waanzinnig onwaarschijnlijk.

Bovendien, zoals Barry Brown in de opmerkingen aangeeft, zul je nooit zoveel gegevens opslaan. Dit is alleen een zorg voor hoge churn-tafels met waanzinnig hoge transactietarieven. In die tabellen moet de toepassing alleen in staat zijn om te gaan met de sleutel die wordt teruggezet naar nul, invoer die opnieuw wordt genummerd of andere copingstrategieën. Maar eerlijk gezegd zal zelfs een tabel met berichtenwachtrijen met veel verkeer niet uitkomen.

Zie:

Serieus, zelfs als je het volgende Gootwitfacegram bouwt, zal dit geen probleem zijn tot ver voorbij de houdbaarheidsdatum van je derde herschrijving van de applicatie...



  1. PHP Laravel:Er kon geen verbinding worden gemaakt omdat de doelmachine dit actief weigerde

  2. Extreem eenvoudige PHP en Mysql

  3. ongeldige triggerfout

  4. Meteoor met mysql