web-dev-qa-db-ja.com

自動インクリメントがmysqlで生成できる最大のID番号は何ですか

私は1日あたり約1万から2万行を話すデータで急速に満たされたデータベースを持っています。

自動インクリメントオプションを使用したIDの制限とは何ですか? IDがINTEGERとして作成されている場合、符号なしの値に対して最大値2,147,483,647を実行できますか?

しかし、オートインクリメントがこれを超えるとどうなりますか?それはすべて崩壊しますか?それでは解決策は何でしょうか?

多くの人が大きなデータベースを持っていると確信していますので、聞いてみたいと思います。

ありがとうございました。

56
user123_456

範囲外に急速に成長することが心配な場合は、PKを無署名のBIGINTとして設定します。これにより、最大値18446744073709551615が得られますが、これで十分です。

61
Dan Armstrong
                    | Min. (inclusive)           | Max. (inclusive)
-----------------------------------------------------------------------------
INT Signed (+|-)    |             -2,147,483,648 |             +2,147,483,647
-----------------------------------------------------------------------------
INT Unsigned (+)    |                          0 |              4,294,967,295
-----------------------------------------------------------------------------
BIGINT Signed (+|-) | -9,223,372,036,854,775,807 | +9,223,372,036,854,775,806
-----------------------------------------------------------------------------
BIGINT Unsigned (+) |                          0 | 18,446,744,073,709,551,615

MySQLリファレンス

列ID(INT unsigned)を持つmysqlテーブルがあり、テーブルに4,294,967,295レコードがある場合、さらに1レコードを挿入しようとすると、新しいレコードのIDは自動的に変更され、「4,294,967,295」である最大値に設定されます。そのため、MySQLエラーメッセージが表示されますDuplicate entry '4294967295' for key 'PRIMARY'、列が主キーとして設定されている場合、IDが重複します。

2可能な解決策:

  1. Easy Approach:IDをBIGINT unsignedに設定して、制限を拡張します、ダンアームストロングが言ったことと同じです。これは壊れないという意味ではありませんが!また、テーブルが非常に大きくなると、パフォーマンスに影響が出る可能性があります。
  2. ハードウェアアプローチパーティション分割を使用 これはもう少し複雑なアプローチですが、パフォーマンスが向上し、データベースの制限はまったくありません(あなたの唯一の制限は、物理ハードディスクのサイズです。)。 Twitter(および同様の巨大なWebサイト)は、1日あたり数百万のツイート(レコード)に対してこのアプローチを使用しています!
28
evilReiko