79

質問の回答、MySQL での UUID パフォーマンスに基づいて、回答者はUUID を文字列ではなく数値として保存することを提案しています。どうすればできるのかよくわかりません。誰でも私に何か提案できますか?私のルビーコードはそれをどのように処理しますか?

4

3 に答える 3

113

私の理解が正しければ、プライマリ列で 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 文字の長さであるため、フィールドは になります。

于 2012-06-08T14:51:59.737 に答える
9

Percona ブログには、あなたの質問に答える記事 (ベンチマークを含む) があります: UUID を最適化された方法で保存します。

于 2015-11-02T20:45:09.377 に答える