Google Cloud Spanner 中的自动增量

Posted

技术标签:

【中文标题】Google Cloud Spanner 中的自动增量【英文标题】:Autoincrement in Google Cloud Spanner 【发布时间】:2017-07-05 10:09:14 【问题描述】:

Google Cloud Spanner recommends 反对对主键使用单调递增的整数。这对于***表来说非常有意义,因为它会创建热点。但是交错表呢?无论如何,它们都将存储在同一个节点上。它们也按排序顺序保存,因此使用 UUID 或其他一些随机 ID 似乎不是最理想的,尤其是如果它们也将按排序顺序检索时。

在这里读取最大 id 并为新行存储 maxId + 1 是正确的解决方案吗?

【问题讨论】:

【参考方案1】:

交错的子表行以父表的键为前缀,因此只要父键是非顺序的,就可以将它们视为非顺序键。在这种情况下,通常应该没问题,因为正如您所注意到的,这整个键范围将由一个 Span 服务器提供服务。如果您担心在这种情况下会热点单个 Span 服务器,最好不要交错表。

还应该注意的是,建议不要单调增加或减少键,因为它们具有相同的效果,只是在范围的相对两侧。

【讨论】:

感谢您的回答。在交错表中使用不断增加的数字的最佳做法是什么?是不是很简单: max = read("SELECT MAX(SubId) FROM SubTable WHERE ParentId = ..."); write("INSERT INTO SubTable (SubId, ...) VALUES (" + (max + 1) + ", ...)") ? 一般来说,如果需要,避免使用 UUID 并使用带有顺序 ID 列的 UUID 仍然是一个好主意。那里潜伏着许多危险,例如确保您在事务中执行此操作,如果删除了最新(和最大值)值会发生什么 - 您可以重复使用它吗?最好使用另一个表来存储计数器并确保您有适当的交易。

以上是关于Google Cloud Spanner 中的自动增量的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Firestore 与 Google Cloud Spanner 的区别?

Google Cloud Spanner 和 Cloud SQL 有啥区别?

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

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

Google Cloud Spanner 是不是支持默认列值?

Google Cloud Spanner 是不是支持任意多对多关系?