鉴于TimeUUID可以方便地允许您在CQL中使用now()
,是否有任何理由您不会继续使用TimeUUID而不是普通的旧UUID?
答案 0 :(得分:54)
UUID
和TIMEUUID
以相同的方式存储在Cassandra中,它们实际上只代表两种不同的排序实现。
TIMEUUID
列首先按其时间组件排序,然后按原始字节排序,而UUID
列按其版本排序,然后如果它们的时间组件都是版本1,则最后是他们的原始字节。奇怪的是,时间组件排序实现在Cassandra代码中的UUIDType
和TimeUUIDType
之间重复,但格式不同。
我认为UUID
与TIMEUUID
问题主要是作为文档:如果您选择TIMEUUID
,那么您说的是按时间顺序存储内容,以及这些内容可以同时发生,因此简单的时间戳是不够的。使用UUID
表示您不关心订单(即使在实践中,如果您将版本1 UUID放入其中,列将按时间排序),您只需要确保具有唯一ID。< / p>
即使使用NOW()
生成UUID
值很方便,其他人阅读您的代码也会非常令人惊讶。
在宏观方案中可能并不重要,但排序非版本1 UUID比版本1快一点,所以如果你有一个UUID
列并自己生成UUID,请选择另一个版本。
答案 1 :(得分:23)
根据documentation,TimeUUID
是普通的UUID
。
UUID只是128-bit value。将其视为难以想象的大数字。
特定位可以通过几种方法中的任何一种来确定。 original method涉及获取计算机网络硬件的MAC address,结合当前日期和时间,加上任意数字和随机数。将所有这些组合在一起以获得几乎唯一的数字。
后来,出于各种原因(安全性,隐私性),在生成UUID值时发明了其他方法来组装比特。这些其他方法省略了日期时间和/或MAC地址作为成分。重点是:并非所有UUID值都具有嵌入的日期时间值。
Cassandra doc错误地将其TimeUUID称为“Type 1 UUID”。正确的术语是版本1 UUID 。此版本有时称为“基于时间的版本”。
一些建议
Cassandra似乎确定了这个特定版本的UUID,目的是提取128位的日期和时间部分。从UUID中提取日期时间是个坏主意。
首先,UUID从未打算用于此类历史记录跟踪。实际上,UUID的规范明确地认识到(a)计算机时钟可以被重置,因此(b)稍后生成的UUID实际上可以记录比先前的UUID更早的日期时间。不从UUID提取日期时间的另一个原因是因为您可能具有不是由time方法生成的UUID,因此您将基于实际上不表示日期时间的位来构建数据时间值创造。第三个原因是,当编程代码稍后被重构时,UUID可能在与数据库记录不同的时间生成,因此使用UUID的日期时间会产生误导。
如果您需要跟踪日期时间历史记录,请明确执行此操作。在数据中创建日期时间字段。顺便说一句,跟踪UTC中的日期时间,但这是另一个主题。
答案 2 :(得分:1)
所有人都说,您需要培养一些才能相信他们。 Timeuuid是版本/级别1 UUID似乎只能将前8个字符随机化,如下所示,因此,有一些冲突的可能,但timeuuid is better than using timestamp本身仍然存在。如果uuid随机性很重要,则使用版本/级别4的UUID几乎是improbable collision更好的选择。
因此,如果您不关心跨分区的唯一性,并且您的分区是具有高写入量的宽行时间序列数据,并且每个事件(时间)都需要一些唯一的标识符,那么这是一个不错的选择,聚集,分页等优点。
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