Cassandra UUID与TimeUUID的优点和缺点

考虑到TimeUUID可以轻松地在CQL中使用now() ,是否有任何理由不会继续使用TimeUUID而不是普通的旧UUID?

UUIDTIMEUUID在Cassandra中的存储方式相同,只是实际上代表了两种不同的sorting实现。

TIMEUUID列首先按其时间分量sorting,然后按原始字节sorting,而UUID列则TIMEUUID其版本sorting,然后按版本1的时间分量sorting,最后按原始字节sorting。 奇怪的是时间组件sorting实现在Cassandra代码中的UUIDTypeTimeUUIDType之间重复,除了不同的格式。

我认为UUIDTIMEUUID问题主要是作为文档:如果你selectTIMEUUID你说的是按照时间顺序存储东西,而这些东西可能同时发生,所以一个简单的时间戳是不够的。 使用UUID表示你不关心顺序(即使在实践中,如果你把版本1的UUID放在列中,列将按时间sorting),你只是想确保事物具有唯一的ID。

即使使用NOW()生成UUID值也很方便,但读取代码的其他人也很惊讶。

在事情的macros观scheme中,这可能并不重要,但sorting非版本1的UUID比版本1快一点,所以如果你有一个UUID列并且自己生成UUID,那么去另一个版本。

根据文档, TimeUUID 一个普通的旧UUID

一个UUID只是一个128位的值 。 把它想成一个难以想象的大数目。

特定的位可以由几种方法中的任何一种来确定。 原来的方法是把计算机networking硬件的MAC地址 ,结合当前的date和时间,加上一个任意数字和一个随机数。 把所有这些挤在一起得到一个几乎独一无二的号码。

后来出于各种原因(安全性,隐私性),在生成UUID值时,发明了其他方法来组装这些比特。 这些其他方法省略date时间和/或MAC地址作为成分。 重点是:并非所有的UUID值都有embedded的date时间值。

Cassandra文档错误地将其TimeUUID称为“types1 UUID”。 正确的术语是版本1 UUID 。 这个版本有时被称为“基于时间的版本”。


一点build议

为了提取128位的date和时间部分,Cassandra似乎确定了这个特定版本的UUID。 从UUID提取date时间是一个坏主意

首先,UUID从来没有打算用于这样的历史跟踪。 事实上,UUID的规范特别认识到(a)计算机时钟可以被重置,因此(b)稍后生成的UUID实际上可以logging比先前的UUID更早的date时间。 不从UUID提取date时间的另一个原因是因为您可能有UUID不是由时间方法生成的,因此您将根据实际上不代表date时间的位构build数据时间值的创作。 第三个原因是,当编程代码被重构时,UUID可能会在与数据库logging不同的时间生成,因此使用UUID的date时间会产生误导。

如果您需要跟踪date时间历史logging,请明确执行。 在您的数据中创build一个date时间字段。 顺便说一句,用UTC来跟踪date时间,但这是另一个话题。