web-dev-qa-db-ja.com

Cassandra UUID vs TimeUUIDの長所と短所

TimeUUIDを使用すると、CQLでnow()を簡単に使用できるため、単純に古いUUIDの代わりに常にTimeUUIDを使用しない理由はありますか?

42
Jacob

UUIDTIMEUUIDはCassandraで同じ方法で保存され、実際には2つの異なる並べ替えの実装のみを表します。

TIMEUUID列はまず時間コンポーネントでソートされ、次に生バイトでソートされますが、UUID列は最初にバージョンでソートされ、次に両方が時間コンポーネントでバージョン1である場合、最後にソートされます生のバイトで。興味深いことに、時間コンポーネントのソートの実装は、異なるフォーマットを除き、CassandraコードのUUIDTypeTimeUUIDTypeの間で複製されます。

UUIDTIMEUUIDの質問は、主にドキュメントとして考えています。TIMEUUIDを選択すると、物事を時系列で保存していると言います。同時に発生する可能性があるため、単純なタイムスタンプだけでは十分ではありません。 UUIDを使用すると、順序を気にしない(バージョン1のUUIDを入れると実際に列が時間順に並べられる場合でも)ことを確認するために、一意のIDを持たせます。

NOW()を使用してUUID値を生成するのが便利な場合でも、コードを読んでいる他の人にとっても非常に驚くべきことです。

おそらく大規模なスキームではそれほど重要ではありませんが、バージョン1以外のUUIDのソートはバージョン1よりも少し速いため、UUID列があり、UUIDを自分で生成する場合は、別のバージョンに進みます。

58
Theo

TimeUUIDdocumentation によると、昔ながらのUUIDです。

A [〜#〜] uuid [〜#〜] は単に 128ビット値想像を絶するほど大きな数だと考えてください。

特定のビットは、いくつかの方法のいずれかによって決定されます。 元の方法 は、コンピューターのネットワークハードウェアの MACアドレス を取得し、現在の日付と時刻に加えて任意の数と乱数を組み合わせることを含みます。これらすべてをひとまとめにして、実質的に一意の番号を取得します。

その後、さまざまな理由(セキュリティ、プライバシー)のために、UUID値を生成するときにビットを組み立てるために他の方法が発明されました。これらの他の方法では、日時やMACアドレスを成分として省略します。ポイント:すべてのUUID値に埋め込みの日時値があるわけではありません。

Cassandra docは、TimeUUIDが「タイプ1 UUID」であると誤って参照しています。正しい用語はVersion 1 UUID。このバージョンは時々呼び出されます。 「時間ベースのバージョン」。


アドバイスのビット

Cassandraは、128ビットの日付と時刻の部分を抽出する目的で、この特定のバージョンのUUIDを識別しているようです。 UUIDから日時を抽出するのは悪い考えです

1つには、UUIDがそのような履歴追跡に使用されることを意図していなかったということです。実際、UUIDの仕様では、(a)コンピューターの時計をリセットできるため、(b)後で生成されたUUIDが実際には以前のUUIDよりも早い日時を記録する可能性があることを明確に認識しています。 UUIDから日時を抽出しないもう1つの理由は、timeメソッドによって生成されなかったUUIDを持っている可能性があるためです。したがって、実際には日時を表していないビットに基づいてデータ時刻値を構築します創造の。 3番目の理由は、プログラミングコードが後でリファクタリングされると、UUIDがデータベースレコードとは異なる時間に生成される可能性があるため、UUIDの日時を使用すると誤解を招く可能性があるためです。

日時の履歴を追跡する必要がある場合は、明示的に行ってください。データに日時フィールドを作成します。ところで、その日時を [〜#〜] utc [〜#〜] で追跡しますが、それは別のトピックです。

24
Basil Bourque

すべては、あなたがそれらを信じるためにいくつかを生成する必要があると言いました。 Timeuuidはバージョン/レベル1ですUUIDは、以下に示すように最初の8文字のみをランダム化するように見えるため、競合する可能性がありますが、それでも timeuuidはタイムスタンプを使用するよりも優れています 自体です。 uuidのランダム性が重要な場合は、バージョン-レベル4 UUIDを使用するほうが、ほぼ 起こりそうな衝突 の場合に適しています。

したがって、パーティション間の一意性を気にせず、パーティションが書き込みの多い広い行の時系列データであり、各イベント(時間)に一意の識別子が必要な場合は、クラスタリングの利点もある良い選択です、ページネーションなど。

insert into test_tuuid(1, now())
insert into test_tuuid(1, now())
insert into test_tuuid(1, now())
insert into test_tuuid(1, now())

49cbda60-961b-11e8-9854-134d5b3f9cf8
49d1a6c1-961b-11e8-9854-134d5b3f9cf8
49d59e61-961b-11e8-9854-134d5b3f9cf8
49d8d2b1-961b-11e8-9854-134d5b3f9cf8
1
kisna