Ответ 1
Это не закончится.
Максимальный размер: 9223372036854775807. При 1000 вставок/секунду, что 106751991167 дней стоит. Почти 300 миллионов лет, если моя математика права.
Даже если вы разделите его, используя смещения, где, скажем, 100 серверов имеют выделенный субдиапазон значений (x*100+0
... x*100+99
), вы не закончите. 10 000 машин, выполняющих 100 000 вставок в секунду, могут попасть туда примерно через три столетия. Конечно, это больше транзакций в секунду, чем Нью-Йоркская фондовая биржа, в течение сотен лет...
Если вы превысите ограничение на размер типа данных сгенерированного ключа, новые вставки не будут выполнены. В PostgreSQL (поскольку вы отметили этот PostgreSQL) с помощью bigserial
вы увидите:
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)
Для обычного serial
вы получите другую ошибку, потому что sequence
всегда 64-бит, поэтому вы достигнете точки, где вам нужно изменить тип ключа на bigint
или получить ошибка как:
regress=# SELECT setval('serialtest_id_seq', 2147483647);
regress=# INSERT INTO serialtest (dummy) VALUES ('ham');
ERROR: integer out of range
Если вы действительно считаете, что ваш сайт может достигнуть предела в bigint в вашем приложении, вы можете использовать составной ключ - скажем (shard_id, subkey) - или ключ uuid.
Попытка справиться с этим в новом приложении - преждевременная оптимизация. Серьезно, из нового приложения для такого роста вы будете использовать ту же схему? Или двигатель базы данных? Или даже codebase?
Вы можете также беспокоиться о конфликтах GUID в системах с ключами GUID. В конце концов, парадокс дня рождения означает, что конфликты GUID более вероятны, чем вы думаете, - невероятно, безумно маловероятно.
Кроме того, как отмечает Барри Браун в комментариях, вы никогда не будете хранить столько данных. Это только забота о высоких таблицах оттока с безумно высокими транзакционными ставками. В этих таблицах приложение просто должно быть способно справиться с ключом reset до нуля, перенумеровать записи или другие стратегии преодоления. Честно говоря, даже высокая таблица очередей сообщений о трафике не собирается превышать.
См:
Серьезно, даже если вы построите следующий Gootwitfacegram, это не будет проблемой до того, как будет использована дата использования вашего третьего приложения...