primary keyをINT
type(AUTO_INCREMENT
)またはUUID
に設定します。これら2つのデータベースのパフォーマンスの違い(SELECT
、INSERT
など)とその理由は何ですか。
UUID
は ユニバーサルユニークID を返します(別のDBにインポートされている場合も同様にユニークです)。
MySQL文書から引用するには(私の強調):
UUIDは空間と時間においてグローバルに一意である番号として設計されています。 UUID()への2つの呼び出しは、2つの異なる値これらの呼び出しが2つの別個のコンピューターで実行されている場合でもが互いに接続されていないことを生成すると予想されます。
一方、単にINT
プライマリIDキー(たとえばAUTO_INCREMENT)は、の一意の整数を返します特定のDBとDBテーブルですが、これは普遍的に一意ではないです(したがって、別のDBにインポートすると、主キーの競合が発生する可能性があります)。
パフォーマンスに関しては、UUID
よりも_auto-increment
_を使用した場合でも、目立った違いはありません。ほとんどの投稿(このサイトの作成者による一部を含む)は、そのように述べています。もちろん、UUID
には少し時間がかかります(そしてスペースもかかります)が、これは(すべてではないにしても)ほとんどの場合のパフォーマンスのボトルネックにはなりません。列を_Primary Key
_として持つと、両方の選択がパフォーマンスと同等になります。以下の参考文献を参照してください。
UUID
に、またはUUID
にしないか?GUID
vs Autoincrement
UUID
vs _auto-increment
_ in cakephp-mysqlUUID
MySQLでのパフォーマンス?ID
sとGUID
s(コーディングホラー)(UUID
対_auto-increment
_のパフォーマンス結果、 Myths、GUID
対Autoincrement
)
UUID
pros/cons( Primary Keys:ID
s vs GUID
s から適用)
GUID
長所
- すべてのテーブル、すべてのデータベース、すべてのサーバーにわたって一意
- 異なるデータベースのレコードを簡単にマージできます
- 複数のサーバーにデータベースを簡単に分散できます
ID
sは、データベースへのラウンドトリップの代わりに、どこにでも生成できます- とにかく、ほとんどのレプリケーションシナリオでは
GUID
列が必要です
GUID
短所
- これは、従来の4バイトのインデックス値の4倍です。注意しないと、パフォーマンスとストレージに深刻な影響を与える可能性があります
- デバッグが面倒(_
where userid='{BAE7DF4-DDF-3RG-5TY3E3RF456AS10}'
_)- 生成された
GUID
sは、最高のパフォーマンス(例:SQL 2005のnewsequentialid()
)を実現し、クラスター化インデックスの使用を可能にするために、部分的にシーケンシャルである必要があります。
私は言及されたリファレンスを注意深く読み、ユースケースに応じてUUID
を使用するかどうかを決定します。そうは言っても、多くの場合、UUID
sが実際に望ましいでしょう。たとえば、データベースをまったく使用またはアクセスせずにUUID
sを生成したり、事前に計算したり、他の場所に格納したUUID
sを使用したりすることもできます。さらに、ID
sの破損や競合の心配をせずに、データベーススキーマやクラスタリングスキームを簡単に一般化/更新できます。
UUIDキーは、DBに永続化されない限りpkになることができないため、トランザクションが成功しない限り、そのpkを想定することはできません。 UUIDのほとんどは、時間ベース、Macベース、名前ベース、またはランダムなUUIDを使用します。コンテナーベースの展開に大きく移行していて、MACアドレスに依存するシーケンスMACアドレスを開始するパターンが機能しないことを考えると、システムが常に正確な時刻同期をとっているという仮定は、時計がルールに準拠しないために正しくない場合があるため、時間ベースは保証されません。 GUID衝突が発生しないことを保証することはできません。特定の短期間に衝突が発生することはありませんが、十分な時間とシステムが並行して実行され、保証されるシステムの急増は最終的に失敗します。[- http://www.ietf.org/rfc/rfc4122.txt] 。