在 Cloud Spanner 中存储 UUID

Posted

技术标签:

【中文标题】在 Cloud Spanner 中存储 UUID【英文标题】:Storing a UUID in Cloud Spanner 【发布时间】:2017-07-06 06:27:32 【问题描述】:

我想在 Cloud Spanner 中使用 UUID 作为主键。读写 UUID 的最佳方式是什么?是否有 UUID 类型或客户端库支持?

【问题讨论】:

【参考方案1】:

最简单的解决方案是将其存储为标准RFC 4122 格式的字符串。例如:

d1a0ce61-b9dd-4169-96a8-d0d7789b61d9

这将需要 37 个字节来存储(36 个字节加上一个长度字节)。如果你真的想保存每一个可能的字节,你可以将你的 UUID 存储为两个 INT64。但是,您需要编写自己的库来序列化/反序列化这些值,并且它们在您的 SQL 查询中看起来不会很漂亮。在大多数情况下,每行额外节省约 21 个字节可能并不值得。

请注意,某些 UUID 生成算法会根据时间戳顺序生成 UUID。如果机器生成的 UUID 值是单调递增的,那么这会导致 Cloud Spanner 中出现热点(这类似于使用时间戳作为主键开头的反模式),因此最好避免这些变体(例如,不推荐使用 UUID 版本 1)。

这个*** answer provides more details about the various UUID versions。 (TL;DR:将版本 4 与 Cloud Spanner 一起使用,因为生成中使用了伪随机数)

【讨论】:

【参考方案2】:

根据 Cloud Spanner documentation:

有几种方法可以将 UUID 存储为主键:

在 STRING(36) 列中。 在一对 INT64 列中。 在 BYTES(16) 列中。

【讨论】:

以上是关于在 Cloud Spanner 中存储 UUID的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地与多个线程并行查询 google-cloud-spanner?

Google Cloud Spanner 和 Cloud SQL 有啥区别?

Google Cloud Spanner 中的自动增量

Cloud Spanner 读取与 Cloud Spanner SQL API

无法在 Spring Data Cloud Spanner 中将 java.sql.Timestamp 转换为 com.google.cloud.Timestamp

Cloud spanner 最佳实践 INTERLEAVE 问题