sql >> データベース >  >> RDS >> Mysql

uuidを数値として保存する方法は?

    私が正しく理解している場合、プライマリ列でUUIDを使用していますか?通常の(整数の)主キーの方が高速であると言われますが、MySQLのダークサイドを使用する別の方法があります。実際、MySQLは、インデックスが必要な場合、他の何よりもバイナリを使用する方が高速です。

    UUIDは128ビットであり、16進数で記述されているため、UUIDの高速化と保存は非常に簡単です。

    まず、プログラミング言語でダッシュを削除します

    110E8400-E29B-11D4-A716-446655440000から 110E8400E29B11D4A716446655440000へ 。

    現在は32文字です(MD5ハッシュのように、これも機能します)。

    単一のBINARY MySQLでは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文字の長さなので。



    1. SQLiteAssetHelperでバージョン番号に+を使用しないようにする方法

    2. UPDATEFROM句のGROUPBY

    3. psycopgを使用した挿入の問題

    4. MIN/MAXとORDERBYおよびLIMIT