【问题标题】:When to use UUID instead of millisecond timestamp in Cassandra?何时在 Cassandra 中使用 UUID 而不是毫秒时间戳?
【发布时间】:2021-01-30 01:56:43
【问题描述】:
我在 cassandra 中创建了表,其中主键是某个以 timeuuid 为数据类型的列。我能够通过存储为bigint 的毫秒精度时间戳值唯一地识别每条记录。
我使用java datastax驱动连接cassandra。在将记录插入数据库之前,我将每条记录的毫秒时间戳转换为 UUID。这是开销,可以删除。
- 考虑到记录能够在没有 timeuuid 唯一性的情况下被识别,有人能解释一下使用
timeuuid 而不是 bigint 有什么好处吗?
-
timeuuid 和 bigint 数据类型之间是否存在性能影响?
【问题讨论】:
标签:
java
cassandra
timestamp
datastax-java-driver
【解决方案1】:
如果从时间戳生成 timeuuid,对性能的影响应该不会很大。 timeuuid 很有用,如果您可能在同一毫秒内发生许多事件,并且您需要排序 - 使用 timeuuid 您可能会在毫秒内获得多达 10,000 个不同的值。典型的用例是具有如下结构的表:
create table tuuid (
pk int,
tuuid timeuuid,
....
....,
primary key (pk, tuiid));
在这种情况下,您将获得排序(升序或降序)以及tuuid 值的唯一性。当然,您可以使用(pk, timestamp, random-value) 的主键,但使用timeuuid,您不需要额外的列来保证唯一性。 timeuuid 的一个缺点是与 Spark 的集成,例如,因为它没有这种类型,并且可能无法执行过滤器的推送。
如果您不需要唯一性,则只需切换到 timestamp - 它在内部表示为 8 字节长 - 与 bigint 相同,但您不需要自己进行转换等。