尽きません。
最大 bigint は 9223372036854775807 です。1000 回の挿入/秒では、106751991167 日分の価値があります。私の計算が正しければ、ほぼ3億年です。
たとえば 100 台のサーバーがそれぞれ専用の値のサブ範囲 ( x*100+0
... x*100+99
) を持つオフセットを使用してパーティション分割しても、不足することはありません。1 秒あたり 100,000 回の挿入を行う 10,000 台のマシンが、約 3 世紀でそこに到達する可能性があります。もちろん、これはニューヨーク証券取引所が何百年も続けてきた 1 秒あたりの取引数よりも多いのです...
生成されたキーのデータ型のサイズ制限を超えた場合、新しい挿入は失敗します。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)
は常に 64 ビットであるため、通常のserial
場合は別のエラーが発生します。そのため、キーの種類を次のように変更するか、次のようなエラーが発生する必要があります。sequence
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 キーを使用できます。
新しいアプリケーションでこれに対処しようとするのは、時期尚早の最適化です。真剣に、新しいアプリケーションからその種の成長まで、同じスキーマを使用しますか? それともデータベースエンジン?それともコードベース?
GUID キー付きシステムでの GUID の衝突について心配することもできます。結局のところ、誕生日のパラドックスは、GUID の衝突があなたが思っているよりもありそうにないということを意味します。
さらに、Barry Brown がコメントで指摘しているように、それほど多くのデータを保存することは決してありません。これは、非常に高いトランザクション レートを持つチャーン テーブルの場合にのみ懸念されます。これらのテーブルでは、アプリケーションは、キーをゼロにリセットしたり、エントリの番号を付け直したり、その他の対処戦略に対処できれば十分です。ただし、正直なところ、トラフィックの多いメッセージ キュー テーブルでさえ、上限に達することはありません。
見る:
真剣に、次の Gootwitfacegram を作成したとしても、3 回目のアプリケーションの書き直しの使用期限を過ぎるまで問題にはなりません...