列「id」の下のPostgreSQL v9.4テーブルにUUID v4値を格納しています。
テーブルを作成するとき、「id」列を VARCHAR(36)、CHAR(36) 、または [〜# 〜] uuid [〜#〜] データ型?
ありがとう!
uuid
を使用します。 PostgreSQLには理由があります。
これは、uuidを128ビットのバイナリフィールドとして内部的に格納します。他の提案されたオプションは、それを16進数として保存します。これは、比較すると非常に非効率です。
それだけでなく:
uuid
は、単純なバイト単位の並べ替えを行います。 text
、char
およびvarchar
は、uuidには無意味な照合とロケールを考慮します。
uuid
の正規表現は1つだけです。同じことはテキストなどには当てはまりません。大文字と小文字の16進数、{...-...}
sなどの有無を考慮する必要があります。
質問はありません。 uuid
を使用します。
他に意味のある唯一のタイプはbytea
です。これは、少なくとも16バイトのUUIDを直接格納するために使用できます。これは、基本的なセット以外のデータ型に対応できないシステムを使用している場合に実行します。
UUIDは、128ビット-> 16バイトであり、比較は数値的に行われるため、最も高速です。
Char(36)とvarchar(36)は同じで遅いようです: http://www.depesz.com/2010/03/02/charx-vs-varcharx-vs-varchar-vs-text / 。
サーバーはEOFをチェックして、各文字の値を読み取るジョブが終了したかどうかを判断する必要があります。
また、テキスト比較は数値比較よりも時間がかかります。また、UUIDは16バイトで構成されるため、UUIDの比較は36文字の2つのテキストを比較するよりもはるかに高速です。
パフォーマンスのためにネイティブUUIDを使用します。
おそらく、インデックスサイズが最も顕著な違いです。VARCHARの場合、86%ほど多くなります。
パフォーマンスの観点からは、PostgreSQL 9.5での大きな違いに気づきませんでした。