UUID を MYSQL テーブルに保存するためのさまざまなオプションとそのトレードオフは何ですか?

StackOverflow https://stackoverflow.com/questions/1363425

  •  20-09-2019
  •  | 
  •  

質問

クライアントが提供する UUID を、MySQL データベース内のいくつかのテーブルの主キーとして使用することを計画しています。

UUID を MySQL データベースに保存するためのさまざまなメカニズムを見つけましたが、それらを相互に比較するものはありませんでした。これらには、次のようなストレージが含まれます。

  • バイナリ(16)
  • チャー(16)
  • チャー(36)
  • VARCHAR(36)
  • 2×BIGINT

より良いオプションはありますか?次の点でオプションを相互に比較するにはどうすればよいですか?

  • 収納サイズ?
  • クエリのオーバーヘッド?(インデックスの問題、結合など)
  • クライアントコードからの値の挿入と更新は簡単ですか?(通常は JPA 経由の Java)

実行している MySQL のバージョンやストレージ エンジンに基づく違いはありますか?現在 5.1 を実行しており、InnoDB を使用する予定でした。UUID を使用してみた実際の経験に基づいたコメントをお待ちしています。ありがとう。

役に立ちましたか?

解決

私は、スマートクライアントのオンライン/オフラインストレージとデータの同期のために、私はいくつかの時点でマージする必要があります知っていたデータベースのためのUUIDを使用しています。私はいつもCHAR(36)またはCHAR(32)(NOダッシュ)を使用しています。あなたは、varchar型と、ほぼすべてのデータベース・サポート・文字の上にわずかなパフォーマンスの向上を取得します。私は、バイナリまたはBIGINTを試したことがありません。あなたが36個のまたは32文字を使用しない場合の注意すべきことの一つは、スペースでその文字の意志パッドです。点である、「テスト」へのオブジェクトのIDを設定し、ユニットテストを書き、その後、データベースにそれを見つけるためにしようとしないでください。 ;)

他のヒント

あなたが実際にすべてのUUIDを使用して設定されている場合は、

私は、バイナリ(16)列に格納して行くだろう。 2倍のBIGINTのようなものを管理するのは非常に面倒になります。また、私はそれらを逆に人々を聞いた同じマシン上でのUUIDの開始は、初めに同じになる傾向があるため、異なる部分は終わりにしているので、あなたがそれらを逆にすれば、あなたのインデックスがより効率的になります。

もちろん、私の本能はあなたがUUIDを使用するための本当に良い理由がない限り、あなたは自動インクリメントの整数を使用すべきであると述べています。一つの良い理由は、異なるデータベースaccrossユニークなキーを生成しています。他のオプションは、INT缶店よりも多くのレコードを持って計画することです。けれども、多くのアプリケーションではなく、本当にこのようなものを必要としています。そこにあなたの鍵のための整数を使用していないときに失わ効率の多くはだけではない、それは彼らと一緒に仕事することも難しくなります。彼らはで入力するにはあまりにも長く、あなたのURLの周りに渡すには本当に長いURLを作ります。だから、あなたがそれを必要とする場合はUUIDで行くが、離れて滞在しようとします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top