UUID のベスト プラクティス
UUIDの概要
AUTO_INCREMENT整数値の代わりに主キーとして使用すると、ユニバーサル一意識別子 (UUID) には次の利点があります。
- UUID は、競合のリスクなしに複数のシステムで生成できます。場合によっては、これにより TiDB へのネットワーク トリップの回数が減り、パフォーマンスが向上します。
- UUID は、ほとんどのプログラミング言語とデータベース システムでサポートされています。
- URL の一部として使用される場合、UUID は列挙攻撃に対して脆弱ではありません。比較すると、
AUTO_INCREMENT数字の場合、請求書 ID またはユーザー ID を推測することが可能です。
ベストプラクティス
バイナリとして保存
テキスト UUID 形式は次のようになります: ab06f63e-8fe7-11ec-a514-5405db7aad56 、これは 36 文字の文字列です。 UUID_TO_BIN()使用すると、テキスト形式を 16 バイトのバイナリ形式に変換できます。これにより、テキストをBINARY(16)列に格納できます。 UUID を取得するときは、 BIN_TO_UUID()関数を使用してテキスト形式に戻すことができます。
UUID形式のバイナリ順序とクラスター化されたPK
UUID_TO_BIN()関数は、 1 つの引数 (UUID) または 2 つの引数 (2 番目の引数がswap_flagとともに使用できます。
ホットスポット回避するために、 TiDB でswap_flag設定しないことをお勧めします。
ホットスポットを回避するために、UUID ベースの主キーにCLUSTEREDオプション明示的に設定することもできます。
swap_flagの効果を示すために、同じ構造を持つ 2 つのテーブルを示します。違いは、 uuid_demo_1に挿入されたデータはUUID_TO_BIN(?, 0)使用し、 uuid_demo_2 UUID_TO_BIN(?, 1)使用することです。
以下のキービジュアライザーのスクリーンショットでは、バイナリ形式でフィールドの順序が入れ替わったuuid_demo_2テーブルの単一の領域に書き込みが集中していることがわかります。

CREATE TABLE `uuid_demo_1` (
`uuid` varbinary(16) NOT NULL,
`c1` varchar(255) NOT NULL,
PRIMARY KEY (`uuid`) CLUSTERED
)
CREATE TABLE `uuid_demo_2` (
`uuid` varbinary(16) NOT NULL,
`c1` varchar(255) NOT NULL,
PRIMARY KEY (`uuid`) CLUSTERED
)
MySQL 互換性
UUID は MySQL でも使用できます。1 UUID_TO_BIN() BIN_TO_UUID()はMySQL 8.0 で導入されました。5 関数UUID()以前のバージョンの MySQL でも使用できます。