2013-07-30 105 views

回答

51

UUID and TIMEUUID在Cassandra中的存儲方式相同,它們只代表兩種不同的排序實現。

TIMEUUID列可以通過時間的成分的第一排序,然後被其原始字節,而UUID列通過其版本第一排序,然後如果兩者都可以通過時間成分版本1,最後可以通過原始字節。奇怪的是,時間組件排序實現在Cassandra代碼中的UUIDTypeTimeUUIDType之間重複,除了不同的格式。

我想到UUIDTIMEUUID主要作爲文檔的問題:如果您選擇TIMEUUID,則表示您按時間順序存儲事物,並且這些事件可能會同時發生,所以僅使用簡單的時間戳是不夠的。使用UUID表示您不關心訂單(即使在實踐中,如果您將版本1的UUID放入列中,列將按時間排序),您只需確保事物具有唯一的ID。

即使使用NOW()生成UUID值很方便,其他人閱讀您的代碼也很令人驚訝。

在事物的宏觀方案中,這可能並不重要,但排序非版本1 UUID比版本1快一點,所以如果你有一個UUID列並自己生成UUID,請轉到另一個版本。

+1

如何排序非版本1UUID更快?例如,版本4的UUID是完全隨機的,我預計會提供最差的排序性能。我同意這個問題應該不重要。如果您使用的是UUID,那麼您可以這樣做是因爲幾個很好的理由,但性能不在其中。幸運的是,今天的計算機可以處理由UUID提出的空間和分類要求。 –

+3

UUID的內容與排序算法的性能無關。非版本1在Cassandra_中排序更快,因爲沒有將字節解包到時間戳中。這是一個非常非常小的差異,我只是覺得它很有趣。 – Theo

+0

是now()函數產生timeuuid的唯一方法嗎?有可能生成自定義的?它僅用於測試我需要定製的測試。 – Pinocchio

19

​​一個是一個普通的舊UUID根據documentation

A UUID只是一個128-bit value認爲它是一個難以想象的大數目。

特定位可以通過幾種方法中的任何一種來確定。 original method涉及到計算機網絡硬件的MAC address,結合當前的日期和時間,再加上一個任意數字和一個隨機數。把所有這些都擠在一起得到一個幾乎獨一無二的號碼。後來,出於各種原因(安全性,隱私),在生成UUID值時發明了其他方法來組裝比特。這些其他方法省略了日期時間和/或MAC地址作爲成分。問題是:並非所有的UUID值都有嵌入的日期時間值。

Cassandra文檔錯誤地將其TimeUUID引用爲「類型1 UUID」。正確的術語是版本1 UUID。這個版本有時被稱爲「基於時間的版本」。


一些建議

卡桑德拉似乎識別UUID的該特定版本用於提取128比特的日期和時間部分的目的。從UUID中提取日期時間是不好主意

首先,UUID從未打算用於這種歷史跟蹤。的確,UUID的規範特別認識到(a)計算機時鐘可以被重置,因此(b)稍後生成的UUID實際上可以記錄比先前的UUID更早的日期時間。不從UUID中提取日期時間的另一個原因是因爲您可能擁有不是由時間方法生成的UUID,因此您將根據實際上不代表日期時間的位構建數據時間值的創作。第三個原因是,當編程代碼稍後重構時,UUID可能會在與數據庫記錄不同的時間生成,因此使用UUID的日期時間會產生誤導。

如果您需要跟蹤日期時間歷史記錄,請明確執行。在您的數據中創建一個日期時間字段。順便說一句,在UTC追蹤日期時間,但這是另一個話題。

+2

爲了記錄,Cassandra文檔明確建議使用ntp來跨所有節點同步系統時間。 http://www.datastax.com/documentation/cassandra/1.2/webhelp/cassandra/install/installRecommendSettings.html – omnibear

+10

同意使用UTC。但是爲了解決您的其他問題:1)時間戳也會受到時鐘漂移的影響,所以在時間序列數據方面它們不如TimeUUID好。 2)在CQL3和使用TimeUUID數據類型的Cassandra模式的上下文中,期望這些列中的所有UUID都是時間編碼的類型1 UUID是合理的。 3)在CQL3中,您可以使用NOW()或特定的日期時間在插入時創建TimeUUID。因此,處理舊數據仍然會導致Cassandra表中歷史上正確的TimeUUID。 – platforms

+0

@平臺將兩個不同的目的合併成一個單一的值是一個壞主意,這是一個不好的做法。在這種情況下,1.日期 - 時間歷史跟蹤和2.主鍵標識符。當您想要將數據導出或導入其他系統/資源/接收器時,您會感到遺憾。作爲進一步證明無謂地造成的混亂,雖然**沒有獲得任何回報**,請重新閱讀本頁面的問題! –