質問の回答、MySQL での UUID パフォーマンスに基づいて、回答者はUUID を文字列ではなく数値として保存することを提案しています。どうすればできるのかよくわかりません。誰でも私に何か提案できますか?私のルビーコードはそれをどのように処理しますか?
3 に答える
私の理解が正しければ、プライマリ列で UUID を使用していますか? 通常の (整数) 主キーの方が高速であると言う人もいますが、MySQL のダークサイドを使用する別の方法があります。実際、インデックスが必要な場合、MySQL はバイナリを使用する方が他の何よりも高速です。
UUID は 128 ビットで 16 進数で記述されるため、UUID の高速化と保存は非常に簡単です。
まず、プログラミング言語でダッシュを削除します
から110E8400-E29B-11D4-A716-446655440000
まで110E8400E29B11D4A716446655440000
。
現在は 32 文字です (これも動作する MD5 ハッシュのように)。
MySQLのシングルBINARY
はサイズが 8 ビットでBINARY(16)
あるため、UUID のサイズ (8*16 = 128) です。
次を使用して挿入できます。
INSERT INTO Table (FieldBin) VALUES (UNHEX("110E8400E29B11D4A716446655440000"))
次を使用してクエリを実行します。
SELECT HEX(FieldBin) AS FieldBin FROM Table
プログラミング言語で、元の UUID と一致するように 9、14、19、および 24 の位置にダッシュを再挿入します。位置が常に異なる場合は、その情報を 2 番目のフィールドに保存できます。
完全な例:
CREATE TABLE `test_table` (
`field_binary` BINARY( 16 ) NULL ,
PRIMARY KEY ( `field_binary` )
) ENGINE = INNODB ;
INSERT INTO `test_table` (
`field_binary`
)
VALUES (
UNHEX( '110E8400E29B11D4A716446655440000' )
);
SELECT HEX(field_binary) AS field_binary FROM `test_table`
この手法を任意の 16 進文字列で使用する場合は、常にlength / 2
フィールド長に対して行います。したがって、sha512 の場合BINARY (64)
、sha512 エンコーディングは 128 文字の長さであるため、フィールドは になります。
Percona ブログには、あなたの質問に答える記事 (ベンチマークを含む) があります: UUID を最適化された方法で保存します。