파티션 검색 색인

Spanner는 파티션을 나누지 않은 검색 색인과 파티션을 나눈 검색 색인을 모두 지원합니다. 이 페이지에서는 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를 사용하여 동일한 결과를 반환하도록 쿼리를 강제할 수도 있습니다. 하지만 쿼리가 가수 singer1에 해당하는 분할만 액세스하는 것이 아닌 모든 색인 분할에 액세스하고 모든 가수의 모든 앨범을 필터링하여 토큰 'happy'를 찾아야 하므로 더 많은 리소스를 사용합니다.

그러나 애플리케이션에서 특정 가수의 앨범이 아닌 모든 앨범을 검색해야 하는 경우가 있습니다. 이러한 경우 파티션을 나누지 않은 색인을 사용해야 합니다.

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

일반적으로 쿼리에 실용적이고 적합한 가장 세분화된 파티셔닝을 사용하는 것이 좋습니다. 예를 들어 애플리케이션이 각 쿼리가 특정 메일함으로 제한된 이메일 편지함을 쿼리하는 경우 편지함 ID에서 검색 색인을 파티션합니다. 그러나 쿼리가 모든 편지함을 검색해야 하는 경우에는 파티션을 나누지 않은 색인이 더 적합합니다.

특정 애플리케이션의 경우 특정 검색 요구사항을 충족하기 위해 여러 파티셔닝 전략이 필요할 수 있습니다. 예를 들어 인벤토리 관리 시스템은 제품 유형 또는 제조업체별로 필터링된 쿼리를 지원해야 할 수 있습니다. 또한 일부 애플리케이션에는 생성 또는 수정 시간별 정렬과 같은 여러 사전 정렬이 필요할 수 있습니다. 이러한 시나리오에서는 각각 해당 쿼리에 최적화된 여러 검색 색인을 만드는 것이 좋습니다.

다음 단계