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

Mysql UUID_SHORT()はUUID()に匹敵しますか

    uuid_short() サーバーIDのビット単位の集合体、かなり静的な時間コンポーネント、および順次増加する24ビット整数を生成します。これらのビットは8バイト整数に詰め込まれます。時間コンポーネントは、サーバーの起動時間に基づいています。

    uuid() 16バイトのバージョン1UUIDを表す16進文字列を生成します。バージョン1のUUIDは、サーバーID、現在のタイムスタンプ、超高速でIDを生成する場合に使用される数バイト、およびいくつかのユーティリティビットのビット単位の集合体です。

    あなたの質問に答えるには:uuid_short uuidに匹敵する時間と空間の独自性を提供します ?答えはノーだ。適切な例として、uuid_shortのサーバーID たった1バイトです。したがって、256台以上のサーバーがある場合、少なくともいくつかのサーバーが同じノードIDを持つことになります。これは、スペースの一意性が失われることを意味します。比較のために、バージョン1のUUIDのサーバーIDは6バイトの長さであり、最大規模の企業サーバーファームを除くすべてのサーバーファームで重複する可能性を効果的に排除します:)

    より良い質問は、uuid_shortかどうかです。 十分です。次の場合、IDの衝突が発生する可能性があります:

    1. 同じサーバーから短時間で1600万を超えるIDSを生成します。 ***
    2. 同じサーバーIDでサーバーをまったく同時に起動し、サーバー間でデータを共有します。
    3. システム時計をいじってから、サーバーを再起動します。

    2番目の問題はほとんどの人にとってはありそうもないようですが、最初の問題はuuid_shortを作成する前に調査する価値があります。 キーの基礎。

    *** uuid_shortのmysqlドキュメントに基づく 、単一サーバーの稼働時間中に1,600万を超えるIDを生成した場合、衝突が発生するようです。しかし、それはばかげているでしょう。 mysqlのドキュメントには、1秒あたり1600万のIDを生成しない限り、問題はないと書かれています。これは、1600万のシーケンシャルIDを使い果たした場合、タイムスタンプの一部のビットをバンプする必要があることを意味します。私はこれをテストしていません。



    1. RESTfulApiまたはSocket.IO

    2. MySQLストアドプロシージャのパラメータとしてFieldNameを渡す

    3. プリペアドステートメントの構文を正しくする

    4. SQLServerのGroupBy、Having、Where句の実行シーケンス?