Spanner mendukung indeks penelusuran yang tidak dipartisi dan dipartisi. Halaman ini menjelaskan cara membuat indeks penelusuran berpartisi di Spanner.
Indeks yang tidak dipartisi dibuat jika klausa PARTITION BY dihilangkan dalam definisi indeks. Dalam indeks yang tidak dipartisi, kueri perlu dibaca dari
semua pemisahan 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
pada satu waktu, 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. Mempartisi indeks penelusuran serupa dengan awalan kunci
indeks sekunder.
Misalnya, ada 1.000.000 SingerIds dalam database dan dua indeks berikut:
GoogleSQL
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;
PostgreSQL
CREATE TABLE albums (
albumid character varying NOT NULL,
singerid character varying NOT NULL,
releasetimestamp bigint NOT NULL,
albumtitle character varying,
albumtitle_tokens spanner.tokenlist GENERATED ALWAYS AS (spanner.tokenize_fulltext(albumtitle)) VIRTUAL HIDDEN,
singerid_tokens spanner.tokenlist GENERATED ALWAYS AS (spanner.token(singerid)) VIRTUAL 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.
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SingerId = "singer1"
AND SEARCH(AlbumTitle_Tokens, 'happy')
PostgreSQL
SELECT albumid
FROM albums
WHERE singerid = 'singer1'
AND spanner.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, terkadang aplikasi perlu menelusuri semua album, bukan album untuk penyanyi tertentu. Dalam kasus ini, Anda harus menggunakan indeks yang tidak dipartisi:
GoogleSQL
SELECT AlbumId
FROM Albums
WHERE SEARCH(AlbumTitle_Tokens, 'piano concerto 1')
PostgreSQL
SELECT albumid
FROM albums
WHERE spanner.search(albumtitle_tokens, 'piano concerto 1')
Rekomendasi umumnya adalah menggunakan perincian partisi yang paling halus yang praktis dan sesuai untuk kueri. Misalnya, jika aplikasi mengirim kueri ke kotak surat email dengan setiap kueri dibatasi ke kotak surat tertentu, partisikan indeks penelusuran berdasarkan 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 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 pra-pengurutan, seperti pengurutan menurut waktu pembuatan atau modifikasi. Dalam skenario ini, sebaiknya Anda membuat beberapa indeks penelusuran, yang masing-masing dioptimalkan untuk kueri yang sesuai. Pengoptimal kueri Spanner otomatis memilih indeks untuk setiap kueri.
Langkah berikutnya
- Pelajari tokenisasi dan tokenizer Spanner.
- Pelajari indeks penelusuran.
- Pelajari indeks numerik.