sql >> Base de Datos >  >> RDS >> Mysql

¿Qué sucede cuando agoto una clave generada por bigint? ¿Cómo manejarlo?

No se agotará.

El bigint máximo es 9223372036854775807 . A 1000 inserciones/segundo, eso equivale a 106751991167 días. Casi 300 millones de años, si mis cálculos son correctos.

Incluso si lo divide, use compensaciones donde, digamos, 100 servidores tienen cada uno un subrango dedicado de los valores (x*100+0 ... x*100+99 ), no te vas a quedar sin. 10 000 máquinas que hacen 100 000 inserciones por segundo podrían llevarlo allí en unos tres siglos. Por supuesto, son más transacciones por segundo que la Bolsa de Valores de Nueva York durante cientos de años...

Si haces exceda el límite de tamaño del tipo de datos de la clave generada, las nuevas inserciones fallarán. En PostgreSQL (ya que ha etiquetado este PostgreSQL) con un bigserial verás:

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)

Para un serial ordinario obtendrá un error diferente, porque la sequence siempre es de 64 bits, por lo que llegará al punto en el que tendrá que cambiar el tipo de clave a bigint o recibe un error como:

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

Si realmente cree que es posible que su sitio alcance el límite de un bigint en su aplicación, podría usar una clave compuesta, digamos (shard_id, subclave), o una clave uuid.

Tratar de lidiar con esto en una nueva aplicación es una optimización prematura. En serio, desde una nueva aplicación hasta ese tipo de crecimiento, ¿usarás el mismo esquema? O motor de base de datos? ¿O incluso código base?

También podría preocuparse por las colisiones de GUID en los sistemas con clave GUID. Después de todo, la paradoja del cumpleaños significa que Las colisiones de GUID son más probables de lo que piensas - en increíblemente, increíblemente improbable.

Además, como señala Barry Brown en los comentarios, nunca almacenará tantos datos. Esto es solo una preocupación para las tablas de abandono alto con tasas de transacción increíblemente altas. En esas tablas, la aplicación solo necesita ser capaz de hacer frente a la clave que se restablece a cero, las entradas se vuelven a numerar u otras estrategias de afrontamiento. Sin embargo, honestamente, incluso una tabla de cola de mensajes de alto tráfico no va a llegar al tope.

Ver:

En serio, incluso si construyes el próximo Gootwitfacegram, esto no será un problema hasta mucho después de la fecha de caducidad de la reescritura de tu tercera aplicación...