Mempartisi indeks penelusuran

Spanner mendukung indeks penelusuran yang tidak dipartisi dan dipartisi. Halaman ini menjelaskan cara membuat indeks penelusuran yang dipartisi di Spanner.

Indeks yang tidak dipartisi dibuat saat klausa PARTITION BY dihilangkan dalam definisi indeks. Dalam indeks yang tidak dipartisi, kueri perlu membaca dari semua bagian indeks. Hal ini membatasi potensi skalabilitas kueri penelusuran teks lengkap.

Di sisi lain, indeks yang dipartisi membagi indeks menjadi unit yang lebih kecil, satu untuk setiap partisi unik. Kueri hanya dapat menelusuri dalam satu partisi satu per satu, yang ditentukan oleh kondisi kesetaraan dalam klausa WHERE. Kueri terhadap indeks yang dipartisi umumnya lebih efisien daripada kueri terhadap indeks yang tidak dipartisi karena Spanner hanya perlu membaca data untuk satu partisi. Partisi indeks penelusuran analog dengan awalan kunci indeks sekunder.

Misalnya, ada 1.000.000 SingerIds dalam database dan dua indeks berikut:

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;

Kueri berikut memilih indeks AlbumsIndexBySingerId karena hanya menelusuri data untuk satu penyanyi. Jenis kueri ini biasanya menggunakan lebih sedikit resource.

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

Anda juga dapat memaksa kueri menggunakan AlbumsUnpartitionedIndex untuk menampilkan hasil yang sama. Namun, kueri ini menggunakan lebih banyak resource, karena kueri perlu mengakses semua pemisahan indeks dan memfilter semua album untuk semua penyanyi guna menemukan token "happy", bukan hanya pemisahan yang sesuai dengan penyanyi singer1.

Namun, ada kalanya aplikasi perlu menelusuri semua album, bukan album untuk penyanyi tertentu. Dalam kasus ini, Anda harus menggunakan indeks yang tidak dipartisi:

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

Rekomendasi umum adalah menggunakan partisi dengan tingkat perincian terbaik yang praktis dan sesuai untuk kueri. Misalnya, jika aplikasi mengkueri kotak surat email dengan setiap kueri dibatasi untuk kotak surat tertentu, partisi indeks penelusuran pada ID kotak surat. Namun, jika kueri perlu menelusuri semua kotak surat, indeks yang tidak dipartisi lebih cocok.

Aplikasi tertentu mungkin memerlukan beberapa strategi partisi untuk menampung persyaratan penelusuran spesifiknya. Misalnya, sistem pengelolaan inventaris mungkin perlu mendukung kueri yang difilter menurut jenis produk atau produsen. Selain itu, beberapa aplikasi mungkin memerlukan beberapa prapengurutan, seperti pengurutan menurut waktu pembuatan atau perubahan. Dalam skenario ini, sebaiknya buat beberapa indeks penelusuran, yang masing-masing dioptimalkan untuk kueri yang sesuai.

Langkah selanjutnya