10

テーブルに非常に多くのエントリがあり、特定の期間 (日、週、月、...) 内の auto_increment ID に 2^32 では不十分な場合はどうなりますか?
MySQL が提供する最大のデータ型では不十分な場合はどうなりますか?

一意の ID を必要とする非常に多くのエントリがテーブルに追加されている状況をどのように解決すればよいでしょうか?

MySQL (またはその他のシステム) 内でネイティブに、無制限の数の一意の ID を達成するか、少なくとも指数関数的に増やすにはどうすればよいでしょうか?

理想的には、次のようなものを期待します

> SELECT * FROM table;

+---+------+
| a |  b   |
+---+------+
| 1 |  1   |
| 1 |  2   |
| 1 |  3   |
|...| .... |
|...| .... |
| 1 | 2^32 |
| 2 |  1   |
| 2 |  2   |
+---+------+

これにより、エントリの量が指数関数的に増加します。

そのような状況にどのように対処しますか?
覚えておいてください - 要件は、すべてのエントリに対して一意の ID を持つことです。

4

10 に答える 10

17

BIGINT UNSIGNEDで十分だと思いませんか?これは、0〜18.446.744.073.709.551.615の範囲、つまり1年で1日あたり50.539.024.859.478.223エントリ(365 d / y)、1時間あたり2.105.792.702.478.259エントリ、1分あたり35.096.545.041.304エントリです。または毎秒584.942.417.355。

1秒あたり600回の書き込み(読み取りなし)を想定すると、最大書き込み速度で974.904。028年のエントリを書き込むことができます。それで十分なはずです。

于 2009-03-31T22:20:36.937 に答える
12

主キーには BIGINT を使用できます。これは、デフォルトでは 64 ビットの数値です。

編集 #2: BIGINT バイト長の変更について前に言ったことは明らかに間違っていました。BIGINT8 バイト制限に固定されています。

于 2009-03-31T20:49:33.283 に答える
7

128 ビット キーを使用するだけです。ユニバース内の原子の数よりも多くの行をすぐに許可できるため、無制限の数のキーは必要ありません。(約256ビット)。

于 2009-03-31T20:47:13.710 に答える
7

この問題が発生するほど多くのデータがある場合、主キーを選択することはほとんど問題になりません。

InnoDB エンジンを使用している場合、頻繁に検索する主キーを選択すると (特に検索で多くの行が返される場合)、主キーがクラスター化されて範囲スキャンが改善されるため、パフォーマンスが向上する可能性があります。 .

于 2009-03-31T22:13:30.010 に答える
5

2^64 の BIGINT に移行することから始めます。GUID は別のオプションですが、これらを「なんらかの形式」で自分で保存する必要があります

于 2009-03-31T20:51:53.123 に答える
2

ウィキペディアの記事から、自動インクリメントの主キーを使用しないでください - GUIDなどを使用してください:

生成された各 GUID が一意であるとは限りませんが、一意のキーの総数 (2^128 または 3.4×10^38) が非常に多いため、同じ数が 2 回生成される確率はごくわずかです。たとえば、約 5×1022 個の星を含む観測可能な宇宙を考えてみましょう。すべての星は、6.8×1015 個の普遍的に一意の GUID を持つことができます。

于 2009-03-31T20:48:30.527 に答える
1

キーに別の列を追加すると、実行する必要があるインデックス スキャンの数が実質的に 2 倍になります (ただし、2 番目の列のインデックスははるかに小さくなります)。

前述のように、VAST データ セットの最適な方法は、GUID (RDBMS がネイティブでサポートしている場合) または varchar(16) のいずれかです。

varchar / varbinary を使用することの良い点は、必要に応じて将来的に列を自動的に拡張できることです。そして悪い点は、整数に比べて varchar / varbinary のキーのパフォーマンスが低いことです。

于 2009-03-31T22:05:18.250 に答える
0

MySQL でそれらを自動的に生成する方法がわかりません。また、必ずしも連続しているとは限りませんが、GUID を使用でき、それらがいっぱいになることを心配する必要はないと確信しています。

于 2009-03-31T20:48:39.263 に答える
0

キー列に chars/varchars を使用し、キーに GUID を使用することもできます。ただし、整数の主キーと比較した場合にパフォーマンスが低下するかどうかはわかりません。

于 2009-03-31T20:52:17.350 に答える