Indeks penelusuran partisi

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

Ringkasan

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

Sebaliknya, indeks yang dipartisi membagi indeks menjadi unit-unit yang lebih kecil, satu untuk setiap partisi unik. Kueri hanya dapat menelusuri dalam satu partisi pada satu waktu, yang ditentukan oleh kondisi kesetaraan dalam klausa WHERE. Kueri terhadap indeks yang dipartisi umumnya lebih efisien dibandingkan dengan kueri indeks yang tidak dipartisi karena Spanner hanya perlu membaca data partisi tunggal. Partisi indeks penelusuran setara dengan awalan kunci sekunder indeks.

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 mencari data untuk satu penyanyi. Jenis kueri ini biasanya menggunakan lebih sedikit Google Cloud Platform.

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

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

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

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

Rekomendasi umumnya adalah menggunakan tingkat perincian partisi terbaik yang praktis dan sesuai dengan kueri. Misalnya, jika aplikasi mengkueri kotak surat email di mana setiap kueri dibatasi untuk kotak surat tertentu, mempartisi indeks pencarian 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 mengakomodasi kebutuhan pencarian mereka yang spesifik. Misalnya, inventaris mungkin perlu mendukung kueri yang difilter menurut jenis produk atau produsen. Selain itu, beberapa aplikasi mungkin memerlukan beberapa presort, seperti seperti mengurutkan berdasarkan waktu pembuatan atau modifikasi. Dalam skenario ini, menyarankan agar Anda membuat beberapa indeks penelusuran, masing-masing dioptimalkan untuk kueri terkait.

Langkah selanjutnya