分区搜索索引

Spanner 支持未分区和分区 搜索索引。 本页面介绍了如何在 Google Cloud 控制台中创建分区搜索索引, Spanner。

概览

如果在索引定义中省略 PARTITION BY 子句,则会创建非分区索引。在未分区索引中,查询需要从 所有索引拆分项。这会限制全文搜索查询的潜在可伸缩性。

而分区索引则会将索引细分为更小的单元, 每个唯一分区对应一个映像查询只能在单个分区内进行搜索 由 WHERE 子句中的等式条件指定。查询 针对分区索引进行的查询通常比针对 未分区索引,因为 Spanner 只需读取一个 单个分区。 搜索索引的分区类似于次级索引的键前缀。

例如,假设数据库中有 1,000,000 个 SingerIds,并且有以下两个索引:

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  SingerId STRING(MAX) NOT NULL,
  ReleaseTimestamp INT64 NOT NULL,
  AlbumTitle STRING(MAX),
  AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN,
  SingerId_Tokens TOKENLIST AS (TOKEN(SingerId)) HIDDEN
) PRIMARY KEY(SingerId, AlbumId);

CREATE SEARCH INDEX AlbumsUnpartitionedIndex
ON Albums(AlbumTitle_Tokens, SingerId_Tokens);

CREATE SEARCH INDEX AlbumsIndexBySingerId
ON Albums(AlbumTitle_Tokens)
PARTITION BY SingerId;

以下查询选择了 AlbumsIndexBySingerId 索引,因为它只搜索单个歌手的数据。此类查询通常会使用较少的资源。

SELECT AlbumId
FROM Albums
WHERE SingerId = "singer1"
AND SEARCH(AlbumTitle_Tokens, 'happy')

您还可以强制查询使用 AlbumsUnpartitionedIndex 返回相同的结果。不过,这种方式会使用更多资源,因为查询需要访问所有索引分块,并过滤所有歌手的所有专辑,才能找到令牌“happy”,而不是仅过滤与歌手 singer1 对应的分块。

不过,有时应用需要搜索所有专辑,而不是特定歌手的专辑。在这些情况下, 使用未分区索引:

SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'piano concerto 1')

一般建议是使用最精细的分区粒度 且适合查询的过滤条件例如,如果应用 查询电子邮件邮箱,其中每个查询都被限制在特定邮箱; 对邮箱 ID 的搜索索引进行分区。但是,如果查询 需要搜索所有邮箱,则更适合使用未分区索引。

某些应用可能需要采用多种分区策略来满足其特定的搜索要求。例如,广告资源 管理系统可能需要支持按产品类型或 制造商。此外,有些应用可能需要多个 Presort,如 例如按创建或修改时间排序在这些情况下,建议您创建多个搜索索引,每个索引都针对相应的查询进行优化。

后续步骤