検索インデックスをパーティショニングする

Spanner は、パーティション分割されていない、またはパーティション分割された検索インデックスの両方をサポートしています。このページでは、パーティション分割された検索インデックスを Spanner で作成する方法について説明します。

概要

インデックス定義で PARTITION BY 句が省略されている場合、パーティション分割されていないインデックスが作成されます。パーティション分割されていないインデックスでは、クエリはすべてのインデックス分割から読み取る必要があります。これにより、全文検索クエリの潜在的なスケーラビリティが制限されます。

一方、パーティション分割されたインデックスは、インデックスを小さな単位(一意のパーティションごとに 1 つ)に分割します。クエリで一度に検索できるパーティションは、WHERE 句の等価条件で指定された 1 つのパーティションのみです。パーティション分割されたインデックスに対するクエリは、Spanner が単一パーティションのデータのみを読み取る必要があるので、パーティション分割されていないインデックスに対するクエリよりも一般的に効率的です。検索インデックスのパーティショニングは、セカンダリ インデックスのキー接頭辞に似ています。

たとえば、データベースに 1,000,000 個の SingerIds と次の 2 つのインデックスがあるとします。

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 を使用して同じ結果を返すことを強制することもできます。ただし、クエリは、歌手 singer1 に対応するスプリットだけでなく、すべてのインデックス分割にアクセスし、すべての歌手のすべてのアルバムをフィルタしてトークン「happy」を見つける必要があるため、リソースの使用量は多くなります。

特定の歌手のアルバムではなく、すべてのアルバムを検索する必要がある場合もあります。このような場合は、パーティション分割されていないインデックスを使用する必要があります。

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

一般に、クエリに実用的で適切なパーティショニングに最適な粒度を使用することをおすすめします。たとえば、アプリケーションがメールボックスをクエリし、各クエリが特定のメールボックスに制限されている場合は、メールボックス ID で検索インデックスをパーティショニングします。ただし、クエリですべてのメールボックスを検索する必要がある場合は、パーティション分割されていないインデックスの方が適しています。

特定のアプリケーションでは、特定の検索要件に対応するために複数のパーティショニング戦略が必要になる場合があります。たとえば、在庫管理システムでは、商品タイプやメーカーでフィルタリングされたクエリをサポートする必要があります。また、一部のアプリケーションでは、作成時間や変更時間による並べ替えなど、複数の並べ替えが必要になる場合があります。このようなシナリオでは、それぞれ対応するクエリ用に最適化された複数の検索インデックスを作成することをおすすめします。

次のステップ