索引和地理分区

Spanner 提供了多种类型的索引,可用于提高查询性能。 为架构和查询模式选择正确的索引类型至关重要,对于使用地理位置分区功能的数据库尤其如此。本页介绍了不同索引类型的优势,以及在选择和使用具有地理分区的 Spanner 索引方面的最佳实践。

索引类型

Spanner 支持全局、本地和远程索引。每种类型都有不同的性能特征和使用情形。对于地理位置分区数据库,了解这些索引类型非常重要。选择合适的索引有助于优化数据库架构和查询,从而显著缩短地理分区数据库的延迟时间。对于不使用地理分区的数据库,了解这些索引类型的重要性较低,因为它们都存储在默认放置位置,并且具有相似的性能特征。

全局索引

全局索引是 Spanner 中的默认索引类型。索引数据存储在默认分区中,该分区可能与表的数据不在同一位置。在地理位置分区表上创建全局索引可能会导致涉及索引列的写入操作的写入延迟时间显著增加,尤其是当索引的默认分区写入仲裁与正在写入的表行的写入仲裁相差甚远时。您可以使用附近的只读副本以及读取租约区域或过时数据读取来缓解全局索引的读取延迟时间。

全局索引具有以下特征:

  • 它们可加快查询速度,否则查询将需要执行全表扫描,并且无论位置如何,它们都可在所有表行中强制执行唯一性。
  • 它们适用于需要在整个数据库中具有唯一值的列。
  • 它们可加快按索引列进行过滤或排序的查询的速度。

以下是全局唯一索引的示例:

CREATE UNIQUE INDEX idx_customer_email ON customer(email);

本地索引

本地索引在被编入索引的表的父层次结构中交错。主键列名称和类型必须与索引表匹配。

本地索引具有以下特征:

  • 它们将索引数据存储在与被索引数据相同的分区中。写入延迟时间取决于特定放置位置的写入仲裁,而不是默认放置位置的写入仲裁。

  • 它们可为以特定键前缀为目标的查询提供最低延迟时间,因为索引和表数据都位于同一位置。

如需创建本地索引,请在父表中交错索引。如果您使用 UNIQUE 本地索引,则唯一性仅在特定父行内强制执行,而不是在整个表中强制执行。

以下示例展示了如何在父表 locations 中创建一个与表 customer 交错的本地索引:

GoogleSQL

-- Create locations placement table
CREATE TABLE locations (
  location STRING(MAX) NOT NULL PLACEMENT KEY,
) PRIMARY KEY(location);

-- Create customer table interleaved in the locations table
CREATE TABLE customer (
  location STRING(MAX) NOT NULL,
  customerId  INT64 NOT NULL,
  email STRING(MAX),
  webcookie STRING(64),
) PRIMARY KEY(location, customerId), INTERLEAVE IN PARENT locations;

-- Create a local index on the interleaved customer table
CREATE INDEX idx_customer_email_local ON customer(location, email),
INTERLEAVE IN locations;

PostgreSQL

-- Create locations placement table
CREATE TABLE locations (
  location varchar NOT NULL PLACEMENT KEY PRIMARY KEY
);

-- Create customer table interleaved in the locations table
CREATE TABLE customer (
  location varchar NOT NULL,
  customerId  BIGINT NOT NULL,
  email varchar(1024),
  webcookie varchar(64),