创建异步二级索引

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

在阅读本页面之前,请先熟悉持续具体化视图

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

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

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

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

何时使用异步二级索引

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

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

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

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

异步二级索引简介

如需在 Bigtable 中使用持续具体化视图作为异步辅助索引,请考虑以下要求:

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

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

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

覆盖索引

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

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

定义异步二级索引

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

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

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 查询。

后续步骤