创建异步二级索引

您可以将连续的物化视图用作表的异步二级索引。

在阅读本页面内容之前,请先熟悉 连续的物化视图

Bigtable 表中的数据通常按 行键编制索引。 不过,您可以从源表创建连续的具体化视图,并将其用作异步二级索引。这样,您就可以通过查询具体化视图,使用不同的查询查找模式检索相同的数据。

异步二级索引是连续的具体化视图,其中包含源表中的一部分列,以及与源表中的行键不同的行键。这些行键可能基于以下转换,这些转换允许您的应用根据不同的查询查找模式检索相同的数据:

  • 源表中的属性,例如列限定符、列值或源行键的一部分。
  • 行键的重新格式化。
  • 将行键与属性相结合的转换。

Bigtable 会以 最终一致的方式自动将异步二级索引与源表 同步。

何时使用异步二级索引

应用通常需要使用不同的查找模式或属性查询相同的数据。例如,假设有一个应用可以通过电子邮件地址或手机号码检索用户信息。您可能希望两种查询模式的性能相同。如果您将电子邮件地址作为 Bigtable 行键,并将手机号码存储在列中,那么手机号码查找的性能会较慢,因为它需要进行全表扫描。

如需在按电话号码查找时提高查询性能,您可以使用 SQL 语句创建连续的具体化视图。SQL 语句会指示 Bigtable 如何使用不同的行键重构数据。 连续的具体化视图就像一个可以查询的表。 然后,您可以使用该视图作为异步二级索引。它为您的应用提供了另一条访问相同数据的路径。每条路径都使用不同的行键,因此您可以为每个查询选择替代路径。如需为查询选择最佳路径,请了解每个表的行键结构以及每个表存储的数据。

在以下使用场景中,使用连续的具体化视图作为异步二级索引可以提高查询性能:

  • 重新设置数据键:如果您需要使用与源表的行键不同的 键查询数据,则可以使用替代键创建连续的 具体化视图,并针对该视图执行查询。
  • 过滤数据:如果您想要过滤源表,并且仅在异步二级索引中填充 特定的数据行,请在定义视图的 SQL 查询中提供 WHERE 子句。
  • 属性键:如果您需要根据非键 属性(例如列限定符或值)查询数据,则可以将其包含在 您的 ORDER BY 子句中。

关于异步二级索引

如需在 Bigtable 中将连续的具体化视图用作异步二级索引,请考虑以下要求:

  • 新异步二级索引的行键必须包含源表的行键,以帮助确保源表中的行与连续的具体化视图的异步二级索引中的行之间存在一对一的映射。
  • 异步二级索引不必与源表具有相同的架构或属性。在 SQL 查询的 SELECT 部分中,您必须指定表中哪些列是必需的,以及您要应用的任何 SQL 数据转换。
  • 异步二级索引只需要复制查询句式所需的数据。不需要提供源表中的所有源数据。
  • 在 Bigtable 中,您选择的行键会提供默认排序顺序。

如需查询异步二级索引,请考虑以下要求:

  • ORDER BY 子句中的每一列都必须包含在 SELECT 子句中。
  • 定义异步二级索引后,您的应用必须能够在查询源表或表示异步二级索引的物化视图之间进行选择。
  • 应用不会直接写入索引,索引会持续与源表同步。请始终写入源表。
  • 异步二级索引最终是一致的;数据首先写入源表,然后转换为异步二级索引格式。
  • 我们建议您创建覆盖索引。如需了解详情,请参阅本文档的 覆盖索引部分。
  • ORDER BY 子句必须包含源表的未修改行键,并且所有数据都必须按升序排序。源表中的行键始终投影到具体化视图;不过,它可以与其他属性相结合。
  • ORDER BY 子句中的列将成为异步二级索引的 结构化行键 的一部分。所有其他选定的列将成为异步二级索引中的非键列值。如果您将 ORDER BY 子句中的值转换为 Bigtable 的特定 GoogleSQL 数据类型,则该值会在异步二级 索引的结构化行键中保留其数据类型。

覆盖索引

覆盖索引包含查询所需的所有列。当您查询覆盖索引时,Bigtable 可以直接从索引检索所有必需的数据,而无需访问源表。我们建议您采用这种方法以获得最佳性能,因为它最大限度地减少了磁盘读取次数。如需创建覆盖索引,请确保 SELECT 语句指定了查询中所需的所有列。

如果您想要创建非覆盖索引,请查询该索引,然后使用结果从源表中查找所需的其他列。

定义异步二级索引

您可以通过使用 SQL 查询创建连续的物化视图来创建异步二级索引,该 SQL 查询定义了异步二级索引。

在以下示例中,SQL 查询会创建一个异步二级索引,让您可以查询用户互动数据。ORDER BY 子句使用用户的手机号码、用户 ID 和电子邮件地址的组合来定义异步二级索引的结构化行键。它还会将名称 interactions 分配给 activity 列族:

SELECT
  user['phone'] AS phone,
  CAST(user['id'] AS INT64) AS user_id,
  _key AS email,
  activity AS interactions
FROM CLICKS_TABLE
ORDER BY 1, 2, 3;

下表通过比较源表中同一行的视图与相应的异步二级索引,说明了如何创建索引:

源表行 异步二级索引行
行键:
_keyuser1@example.com



属性:
user{id: "123", phone: "555-123-4567"}
activity{action: "CLICKED_PRODUCT_A"}
结构化行键:
phone555-123-4567
user_id123
emailuser1@example.com

属性:
interactions{action: "CLICKED_PRODUCT_A"}
行键:
_keyuser2@example.com



属性:
user{id: "456", phone: "555-987-6543"}
activity{action: "VIEWED_PRODUCT_B"}
结构化行键:
phone555-987-6543
user_id456
emailuser2@example.com

属性:
interactions{action: "VIEWED_PRODUCT_B"}
行键:
_keyuser3@example.com



属性:
user{id: "1000", phone: "555-111-2222"}
activity{action: "ADDED_TO_CART_PRODUCT_C"}
结构化行键:
phone555-111-2222
user_id1000
emailuser3@example.com

属性:
interactions{action: "ADDED_TO_CART_PRODUCT_C"}

限制

  • 如需读取输出键(即异步二级索引键),您只能使用 SQL 查询。

后续步骤