database - 如何在 BigTable 中组合行键?

标签 database bigtable google-cloud-bigtable

https://cloud.google.com/bigtable/docs/schema-design清楚地描述了如何选择表的行键。但是我找不到有关如何编写此行键的任何信息。它是在哪里以及通过什么方式组成的?

最佳答案

组合行键是 BT 中数据模型设计的重要组成部分。在设计表时,您需要提前知道数据将如何获取,以便优化您对 BT 的使用。

BT 最擅长通过行键获取单行。因此,如果您可以将表(和应用程序的数据模型)设计为始终通过特定键获取数据,那就太棒了。

例如,每个用户都将其用户 ID(比如“1234”)作为其行键。并且您总是通过用户标识获取(“获取用户标识“1234””)。简单。

但事情并不总是那么容易。在某些数据模型中,您需要的数据分散在多行中。这不像以前的情况那么理想,但仍然可以工作。这种获取模式称为“扫描”——BT 支持它,但有一个重要的警告:它只能获取共享一个公共(public)前缀的所有行。此外,与按行键获取相比,扫描速度也较慢。

在上面示例的上下文中,扫描意味着“获取用户 ID 以“123”开头的所有行”。当然,这没有多大意义:您很少需要通过共享前缀提取用户标识。但在某些数据模型中,使用扫描可能是有意义的。例如,如果您的 rowkey 是一个时间戳,并且您想获取两个时间戳之间的所有项目。

您可以通过组合来自不同字段的 rowkey 将其提升到一个新的水平 - 从而允许进行更有趣的扫描:

如果您的数据模型调用按用户 ID 和时间戳范围进行提取,您可以这样组合行键:“userid-timestmap”,然后提取所有从“1234-(start-timestmap)”开始的行,结束于“1234-(结束时间戳)”。我相信这就是“组合”行键的含义。

(另一个要记住的事情是,正如此处另一个答案所提到的,您希望避免在您的表上创建“热点”:流行的行不应彼此相邻存储,以优化并行更新和获取。因为 rowkeys 按字典顺序存储在 BT 中,避免热点的一种方法是选择或组合 rowkeys,使流行的 rowkeys 在字典顺序上彼此不接近)。

关于database - 如何在 BigTable 中组合行键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46347989/

相关文章:

sql - Postgresql 中不可预测的查询性能

mysql - django mysql 数据库连接协议(protocol)

mysql - Laravel 许多模型作为 Publisher 与枢纽的多态关系?

database - BigTable 是面向对象的数据库吗?

java - 配置 Bigtable 和 gRPC 日志记录

java - BigtableConfiguration v 运行 Bigtable 模拟器时的 BigtableOptions

mysql - 如何查询下一行

SQL 查询 : inner joins optimization between big tables

google-app-engine - 谷歌应用引擎 : Is This a Good set of Entity Groups?

Bigtable:在行键上使用时间戳时避免热点