Spanner menawarkan beberapa jenis indeks untuk meningkatkan performa kueri. Memilih jenis indeks yang benar untuk skema dan pola kueri Anda sangat penting, terutama untuk database yang menggunakan partisi geografis. Halaman ini menjelaskan manfaat berbagai jenis indeks dan praktik terbaik untuk memilih dan menggunakan indeks Spanner dengan partisi geografis.
Jenis indeks
Spanner mendukung indeks global, lokal, dan jarak jauh. Setiap jenis memiliki karakteristik performa dan kasus penggunaan yang berbeda. Untuk database yang dipartisi secara geografis, penting untuk memahami jenis indeks ini. Memilih indeks yang tepat akan membantu Anda mengoptimalkan skema dan kueri database, yang dapat meningkatkan latensi secara signifikan untuk database berpartisi geografis Anda. Untuk database yang tidak menggunakan partisi geografis, tidak terlalu penting untuk memahami jenis indeks ini karena semuanya disimpan di penempatan default dan memiliki karakteristik performa yang serupa.
Indeks global
Indeks global adalah jenis indeks default di Spanner. Data indeks disimpan di partisi default, yang mungkin tidak ditempatkan bersama dengan data tabel. Membuat indeks global pada tabel yang dipartisi secara geografis dapat menyebabkan latensi tulis yang jauh lebih tinggi untuk operasi tulis yang melibatkan kolom yang diindeks, terutama jika kuorum tulis partisi default untuk indeks jauh dari kuorum tulis baris tabel yang sedang ditulis. Anda dapat mengurangi latensi baca indeks global dengan menggunakan replika hanya baca di dekat wilayah sewa baca atau bacaan usang.
Indeks global memiliki karakteristik berikut:
- Indeks mempercepat kueri yang jika tidak akan memerlukan pemindaian tabel penuh, dan memastikan keunikan di semua baris tabel, terlepas dari lokasinya.
- Jenis pencocokan ini cocok untuk kolom yang memerlukan nilai unik di seluruh database.
- Indeks mempercepat kueri yang memfilter atau mengurutkan menurut kolom yang diindeks.
Berikut adalah contoh indeks unik global:
CREATE UNIQUE INDEX idx_customer_email ON customer(email);
Indeks lokal
Indeks lokal disisipkan dalam hierarki induk tabel yang diindeks. Nama dan jenis kolom kunci primer harus cocok dengan tabel yang diindeks.
Indeks lokal memiliki karakteristik berikut:
Mereka menyimpan data indeks dalam partisi yang sama dengan data yang diindeks. Latensi penulisan tunduk pada kuorum penulisan penempatan tertentu, bukan kuorum penulisan penempatan default.
Cara ini memberikan latensi terendah untuk kueri yang menargetkan awalan kunci tertentu, karena data indeks dan tabel ditempatkan bersama di penempatan yang sama.
Untuk membuat indeks lokal, selang-selingi indeks dalam tabel induk. Jika Anda menggunakan indeks lokal
UNIQUE, keunikan hanya diterapkan dalam baris induk tertentu, bukan di seluruh tabel.
Berikut adalah contoh pembuatan indeks lokal pada tabel customer, yang disisipkan dalam tabel induk locations:
GoogleSQL
-- Create locations placement table
CREATE TABLE locations (
location STRING(MAX) NOT NULL PLACEMENT KEY,
) PRIMARY KEY(location);
-- Create customer table interleaved in the locations table
CREATE TABLE customer (
location STRING(MAX) NOT NULL,
customerId INT64 NOT NULL,
email STRING(MAX),
webcookie STRING(64),
) PRIMARY KEY(location, customerId), INTERLEAVE IN PARENT locations;
-- Create a local index on the interleaved customer table
CREATE INDEX idx_customer_email_local ON customer(location, email),
INTERLEAVE IN locations;
PostgreSQL
-- Create locations placement table
CREATE TABLE locations (
location varchar NOT NULL PLACEMENT KEY PRIMARY KEY
);
-- Create customer table interleaved in the locations table
CREATE TABLE customer (
location varchar NOT NULL,
customerId BIGINT NOT NULL,
email varchar(1024),
webcookie varchar(64),
PRIMARY KEY(location, customerId)
) INTERLEAVE IN PARENT locations;
-- Create a local index on the interleaved customer table
CREATE INDEX idx_customer_email_local ON customer(location, email)
INTERLEAVE IN locations;
Saat mengkueri data dalam transaksi baca-tulis, Anda harus menentukan awalan kunci utama tabel yang diindeks dalam kueri. Jika tidak, kueri mungkin memerlukan pemindaian tabel penuh. Contoh:
GoogleSQL
-- The location (the index key prefix) must be specified
SELECT *
FROM customer
WHERE location= @location AND email= @email;
PostgreSQL
-- The location (the index key prefix) must be specified
SELECT *
FROM customer
WHERE location= @location AND email= @email;
Untuk mengetahui informasi tentang pengoptimalan yang tidak mengharuskan Anda menentukan lokasi, lihat Menggunakan indeks unik global dengan indeks lokal atau jarak jauh.
Indeks lokal juga berguna saat tabel penempatan berbasis entity dan Anda ingin mengindeks data dalam entity atau sub-entity tertentu. Contoh:
GoogleSQL
-- Create entity based customer placement table
CREATE TABLE customer (
customerId INT64 NOT NULL,
email STRING(MAX),
webcookie STRING(64),
location STRING(MAX) NOT NULL PLACEMENT KEY
) PRIMARY KEY(customerId);
-- Create customerOrders child table
CREATE TABLE customerOrders (
customerId INT64 NOT NULL,
orderId INT64 NOT NULL,
orderName STRING(MAX) NOT NULL
) PRIMARY KEY(customerId, orderId), INTERLEAVE IN PARENT customer;
-- Create a local index on the interleaved child table
CREATE INDEX idx_order_local ON customerOrders(customerId, orderName),
INTERLEAVE IN customer;
PostgreSQL
-- Create entity based customer placement table
CREATE TABLE customer (
customerId BIGINT NOT NULL PRIMARY KEY,
email varchar(1024),
webcookie varchar(64),
location varchar NOT NULL PLACEMENT KEY
);
-- Create customerOrders child table
CREATE TABLE customerOrders (
customerId BIGINT NOT NULL,
orderId BIGINT NOT NULL,
orderName varchar(1024) NOT NULL,
PRIMARY KEY(customerId, orderId)
) INTERLEAVE IN PARENT customer;
-- Create a local index on the interleaved child table
CREATE INDEX idx_order_local ON customerOrders(customerId, orderName)
INTERLEAVE IN customer;
Indeks jarak jauh
Indeks jarak jauh menyisipkan data indeks di bawah tabel yang bukan ancestor dalam hierarki penyisipan tabel yang diindeks. Jenis kunci utama harus cocok dengan jenis kolom indeks yang sesuai, tetapi namanya bisa berbeda.
Dengan partisi geografis, Anda hanya dapat menyisipkan indeks jarak jauh di bawah tabel penempatan root yang dikelola secara otomatis. Tabel ini berisi satu baris untuk setiap penempatan di database Anda.
Indeks jarak jauh memiliki karakteristik berikut:
- Fitur ini sangat berguna saat kunci utama tabel Anda tidak memiliki awalan menggunakan kunci penempatan, tetapi Anda ingin mengelompokkan partisi indeks secara geografis sesuai dengan kunci penempatan.
- Kolom ini hanya mendukung pengindeksan kolom dalam tabel penempatan, dan bukan di kolom mana pun dalam tabel turunan yang disisipkan.
Untuk menggunakan indeks jarak jauh dengan partisi geografis, buat tabel penempatan root
dengan menetapkan opsi auto_managed_root_placement_table_name dalam pernyataan DDL ALTER
DATABASE.
Gunakan pernyataan
ALTER DATABASE DDLuntuk membuat tabel penempatan root.GoogleSQL
ALTER DATABASE DATABASE_NAME SET OPTIONS (auto_managed_root_placement_table_name="TABLE_NAME");Ganti kode berikut:
- DATABASE_NAME: Nama database Anda.
- TABLE_NAME: Nama tabel yang akan dibuat. Sebaiknya
gunakan nama
root_placement_table.
Misalnya, perintah berikut akan membuat tabel bernama
root_placement_table.ALTER DATABASE example_db SET OPTIONS (auto_managed_root_placement_table_name='root_placement_table');Setelah Anda membuat tabel penempatan root, Spanner akan membuat tabel internal dan otomatis menyisipkan serta menghapus baris saat Anda membuat atau menghapus penempatan. Berikut adalah contoh tabel penempatan yang ditentukan sistem yang dibuat oleh Spanner, dengan nama tabel contoh ditetapkan ke
root_placement_table. (Jangan jalankan contoh ini.)// Automatically generated after you run the previous example. // Don't put this in your schema explicitly. CREATE TABLE root_placement_table ( location STRING(MAX) NOT NULL PLACEMENT KEY ) PRIMARY KEY(location);
PostgreSQL
ALTER DATABASE DATABASE_NAME SET spanner.auto_managed_root_placement_table_name='TABLE_NAME';Ganti kode berikut:
- DATABASE_NAME: Nama database Anda.
- TABLE_NAME: Nama tabel yang akan dibuat.
Misalnya, untuk membuat tabel
root_placement_tableyang digunakan sebagai root interleave, jalankan:ALTER DATABASE example_db SET spanner.auto_managed_root_placement_table_name='root_placement_table';Setelah Anda membuat tabel penempatan root, Spanner akan membuat tabel internal dan otomatis menyisipkan serta menghapus baris saat Anda membuat atau menghapus penempatan. Berikut adalah contoh tabel penempatan yang ditentukan sistem yang dibuat oleh Spanner, dengan nama tabel contoh ditetapkan ke
root_placement_table. (Jangan jalankan contoh ini.)// Automatically generated after you run the previous example. // Don't put this in your schema explicitly. CREATE TABLE root_placement_table ( location varchar NOT NULL PLACEMENT KEY, PRIMARY KEY (location) );
Buat indeks jarak jauh yang disisipkan di bawah tabel
root_placement_tableyang dikelola secara otomatis.GoogleSQL
-- Create a customer table with a primary key that is not the location CREATE TABLE customer ( customerId INT64 NOT NULL , email STRING(MAX), webcookie STRING(64), location STRING(MAX) NOT NULL PLACEMENT KEY, ) PRIMARY KEY(customerId); -- Create a remote index on the customer table CREATE INDEX idx_customer_email_remote ON customer(location, email), INTERLEAVE IN root_placement_table;PostgreSQL
-- Create a customer table with a primary key that is not the location CREATE TABLE customer ( customerId BIGINT NOT NULL PRIMARY KEY, email varchar(1024), webcookie varchar(64), location varchar NOT NULL PLACEMENT KEY ); -- Creates a remote index on the customer table CREATE INDEX idx_customer_email_remote ON customer(location, email) INTERLEAVE IN root_placement_table;Saat Anda membuat kueri data dalam transaksi baca-tulis, tentukan awalan kunci indeks dalam predikat kueri sehingga pemindaian tabel penuh tidak diperlukan. Contoh:
GoogleSQL
-- Specify the location (the index key prefix) in query SELECT * FROM customer WHERE location= @location AND email= @email;Untuk mengetahui informasi tentang pengoptimalan yang tidak mengharuskan Anda menentukan lokasi, lihat bagian Indeks unik global dengan indeks lokal atau jarak jauh
PostgreSQL
-- Specify the location (the index key prefix) in query SELECT * FROM customer WHERE location= @location AND email= @email;Untuk mengetahui informasi tentang pengoptimalan yang tidak mengharuskan Anda menentukan lokasi, lihat bagian Indeks unik global dengan indeks lokal atau jarak jauh.
Pengoptimalan untuk indeks unik global
Saat Anda menggunakan indeks unik global, Spanner dapat memicu peningkatan latensi kueri dengan pengoptimalan berbasis heuristik dalam kasus penggunaan berikut:
- Saat Anda menggunakan indeks unik global dengan indeks lokal atau jarak jauh
- Saat Anda menggunakan indeks unik global dengan kunci utama parsial
Bagian berikut menjelaskan cara Spanner menerapkan pengoptimalan dalam setiap kasus penggunaan.
Indeks unik global dengan indeks lokal atau jarak jauh
Untuk meningkatkan latensi kueri lokal, Spanner dapat memulai pengoptimalan berbasis heuristik saat indeks unik global digabungkan dengan indeks lokal atau jarak jauh.
Pengoptimalan ini meminimalkan latensi untuk kueri intra-region — bahkan saat lokasi data yang dipartisi secara geografis tidak ditentukan — dengan menebak bahwa penempatannya sama dengan lokasi klien dan melewati partisi default indeks global, atau menghilangkan kebutuhan untuk pemindaian tabel lengkap yang difilter. Pendekatan ini sangat bermanfaat jika klien sebagian besar mengakses data yang disimpan dalam region mereka sendiri.
Menggunakan campuran berbagai jenis indeks akan berguna jika latensi kueri intra-region menjadi perhatian utama, dan Anda dapat mentoleransi peningkatan latensi penulisan. Menggabungkan berbagai jenis indeks juga meningkatkan performa kueri dalam region, meskipun Anda tidak menentukan lokasi dalam kueri.
Pengoptimalan ini mengharuskan Anda membuat indeks unik global dan indeks lokal atau jarak jauh yang sesuai pada kolom yang sama. Data yang diindeks harus unik secara global. Spanner menerapkan pengoptimalan ini ke kueri Anda jika hal berikut benar:
- Anda tidak mengetahui awalan kunci utama dan tidak menentukan lokasi data.
- Permintaan Anda berasal dari region yang sama dengan leader default penempatan data, yang berisi shard indeks lokal atau jarak jauh.
Spanner menerapkan pengoptimalan dengan cara berikut:
- Jika pengoptimalan dipicu dan baris ditemukan di penempatan lokal: Mengingat indeks unik global, Spanner tidak perlu menelusuri lokasi lain. Kueri Anda memiliki latensi intra-region.
- Jika penelusuran lokasi awal tidak menampilkan baris: Hal ini menunjukkan bahwa kueri tersebut bukan kueri intra-region. Spanner akan kembali menggunakan indeks global.
Contoh berikut membuat indeks unik global dan indeks lokal:
GoogleSQL
CREATE UNIQUE INDEX idx_customer_email ON customer(email);
CREATE INDEX idx_customer_email_local ON customer(location, email), INTERLEAVE IN locations;
PostgreSQL
CREATE UNIQUE INDEX idx_customer_email ON customer(email);
CREATE INDEX idx_customer_email_local ON customer(location, email) INTERLEAVE IN locations;
Contoh berikut membuat indeks unik global dan indeks jarak jauh:
GoogleSQL
CREATE UNIQUE INDEX idx_customer_email ON customer(email);
CREATE INDEX idx_customer_email_remote ON customer(location, email), INTERLEAVE IN root_placement_table;
PostgreSQL
CREATE UNIQUE INDEX idx_customer_email ON customer(email);
CREATE INDEX idx_customer_email_remote ON customer(location, email) INTERLEAVE IN root_placement_table;
Berdasarkan indeks contoh sebelumnya, contoh kueri berikut memiliki latensi dalam region:
GoogleSQL
SELECT *
FROM customer
WHERE email= @email;
PostgreSQL
SELECT *
FROM customer
WHERE email= @email;
Indeks unik global pada kunci utama parsial
Spanner dapat menerapkan pengoptimalan yang serupa dengan yang dijelaskan dalam Menggunakan indeks unik global dengan indeks lokal atau jarak jauh saat menggunakan indeks unik global pada kunci primer parsial.
Contoh berikut membuat customer yang disisipkan dalam tabel induk locations, lalu membuat indeks unik global pada kolom customerId.
GoogleSQL
-- Create locations placement table
CREATE TABLE locations (
location STRING(MAX) NOT NULL PLACEMENT KEY,
) PRIMARY KEY(location);
-- Create customer table interleaved in the locations table
CREATE TABLE customer (
location STRING(MAX) NOT NULL,
customerId INT64 NOT NULL,
email STRING(MAX),
webcookie STRING(64),
) PRIMARY KEY(location, customerId), INTERLEAVE IN PARENT locations;
-- Create global unique index on customerId column
CREATE UNIQUE INDEX idx_customer_customerid ON customer(customerId);
PostgreSQL
-- Create locations placement table
CREATE TABLE locations (
location varchar NOT NULL PLACEMENT KEY PRIMARY KEY
);
-- Create customer table interleaved in the locations table
CREATE TABLE customer (
location varchar NOT NULL,
customerId BIGINT NOT NULL,
email varchar(1024),
webcookie varchar(64),
PRIMARY KEY(location, customerId)
) INTERLEAVE IN PARENT locations;
-- Create global unique index on customerId column
CREATE UNIQUE INDEX idx_customer_customerid ON customer(customerId);
Pengoptimalan berlaku untuk kueri seperti berikut:
GoogleSQL
SELECT * FROM customer WHERE customerId= @customerId;
PostgreSQL
SELECT * FROM customer WHERE customerId= @customerId;
Jika Anda tidak membuat indeks unik global, kueri ini mungkin memerlukan pemindaian tabel penuh. Jika Anda tidak menggunakan indeks unik global, Anda harus menambahkan filter lokasi dalam kueri untuk mencapai latensi kueri yang baik:
GoogleSQL
SELECT * FROM customer WHERE location = @location AND customerId= @customerId;
PostgreSQL
SELECT * FROM customer WHERE location = @location AND customerId= @customerId;
Pedoman umum untuk memilih jenis indeks guna mendapatkan latensi yang optimal
Jenis indeks yang Anda pilih secara langsung memengaruhi latensi kueri. Lokasi data indeks relatif terhadap data tabel adalah faktor utama dalam performa untuk workload yang dipartisi secara geografis.
Bagian ini menjelaskan cara memilih antara indeks global, lokal, dan jarak jauh.
Kapan harus memilih indeks global
Gunakan indeks global jika beban kerja Anda dapat mentoleransi latensi baca dan tulis terkait, atau jika Anda memerlukan keunikan global yang diterapkan pada kolom yang diindeks.
Pertimbangkan hal berikut saat memilih indeks global:
- Jarak antara klien dan pemimpin kuorum penulisan default, beserta latensi default kuorum, menentukan peningkatan latensi penulisan. Efek ini secara khusus terbatas pada operasi yang melibatkan kolom yang diindeks, seperti penyisipan baris atau pembaruan pada kolom yang diindeks.
- Menambahkan replika hanya baca atau menggunakan sewa baca dapat mengurangi peningkatan latensi baca:
- Menambahkan replika hanya baca di lokasi geografis yang berdekatan dapat mengurangi latensi baca yang tidak sinkron.
- Menambahkan replika hanya baca dan menggunakan region sewa baca dapat mengurangi latensi baca yang kuat. Jika Anda menambahkan replika hanya baca tanpa menggunakan region sewa baca, latensi baca yang kuat tidak akan berkurang, tetapi throughput baca dapat meningkat.
- Spanner selalu menyajikan pembacaan transaksional pesimis dari pemimpin. Menambahkan replika ke penempatan default tidak membantu pembacaan data transaksional pesimis di penempatan default.
- Indeks global (termasuk kunci dan nilai penyimpanan) ditempatkan di penempatan default, yang tidak memberikan residensi data tingkat penempatan. Untuk mengetahui informasi selengkapnya, lihat Ringkasan residensi data Spanner.
Kapan harus memilih indeks lokal dan jarak jauh
Pertimbangkan hal berikut saat memilih indeks lokal dan jarak jauh:
- Indeks lokal dan jarak jauh memberikan performa baca dan tulis lokal penempatan, tetapi mengorbankan keunikan global dan properti pengurutan kolom indeks unik. Sebagai gantinya, indeks lokal dan jarak jauh memberikan pengurutan dan keunikan kolom yang diindeks dalam baris induk tempat kolom tersebut disisipkan.
- Saat menggunakan indeks lokal atau jarak jauh, Anda harus menyertakan lokasi penempatan dalam predikat kueri, kecuali jika ada indeks unik global yang memungkinkan Spanner menebak lokasi penempatan lokal. Jika tidak, rencana dan performa kueri tidak akan deterministik. Spanner dapat melakukan pemindaian tabel dasar atau menyebar dan mengumpulkan dari indeks di seluruh lokasi penempatan berdasarkan statistik kueri, sehingga meningkatkan latensi.
Kapan harus memilih indeks unik global dengan indeks lokal atau jarak jauh
Pertimbangkan hal berikut saat memilih kombinasi indeks unik global bersama dengan indeks lokal atau jarak jauh:
- Jika lokasi penempatan tertentu tidak diketahui, gunakan kombinasi indeks unik global dengan indeks lokal atau jarak jauh. Pendekatan ini ideal saat sebagian besar kueri berasal dari layanan yang berlokasi secara geografis di dalam region yang sama dengan penempatan data yang diminta.
- Saat menulis indeks global, latensi tulis tunduk pada latensi kuorum tulis default tambahan.
- Dengan pengoptimalan berbasis heuristik, kueri ditayangkan oleh shard indeks lokal dan menunjukkan latensi intra-region hampir sepanjang waktu.
Pedoman mendetail untuk memilih indeks untuk desain skema tertentu
Strategi indeks yang optimal bergantung pada struktur kunci utama tabel dan pola kueri aplikasi Anda. Bagian ini memberikan panduan untuk memilih jenis indeks yang sesuai untuk tiga desain skema umum:
- Skema yang menggunakan entity sebagai kunci utama
- Skema yang menggunakan lokasi sebagai kunci utama
- Skema yang menggunakan nilai terkait lokasi sebagai kunci utama
Desain skema: Entitas sebagai kunci utama
Jika skema Anda menggunakan entity sebagai kunci utama, pilih strategi pengindeksan berdasarkan apakah lokasi ditentukan dalam kueri Anda atau tidak.
Dalam kasus ketika entity seperti customerID adalah kunci utama dan kolom
non-kunci terpisah seperti location adalah kunci penempatan, tentukan strategi
pengindeksan untuk tabel penempatan berdasarkan pola kueri Anda. (Jangan gunakan
entitas sebagai kunci utama tabel penempatan jika latensi penyisipan menjadi masalah bagi
entitas.)
Jika Anda ingin mengindeks data di entity tertentu, seperti customerID,
gunakan indeks lokal. Data diindeks dan diurutkan dalam entitas, tetapi tidak di seluruh entitas. Misalnya, jika Anda ingin mengindeks setiap pesanan pelanggan menurut
tanggal, Anda dapat membuat indeks lokal yang disisipkan di bawah identitas customerID.
Jika lokasi selalu diketahui dalam kueri Anda, gunakan salah satu strategi berikut:
Jika lokasi selalu diketahui dalam kueri Anda dan tidak diperlukan penerapan keunikan global, gunakan indeks jarak jauh. Indeks ini memberikan latensi dalam region untuk operasi baca dan tulis.
Indeks jarak jauh hanya mendukung pengindeksan kolom dalam tabel penempatan, bukan dalam kolom dalam tabel yang disisipkan. Indeks jarak jauh harus disisipkan di bawah tabel penempatan root. Indeks jarak jauh mengindeks data di semua baris penempatan untuk penempatan.
Jika lokasi tidak selalu diketahui dalam kueri Anda, gunakan salah satu strategi berikut:
Jika kolom yang diindeks unik secara global, buat indeks unik global untuk menerapkan keunikan tersebut.
Untuk mencapai pembacaan kuat latensi rendah, buat indeks jarak jauh selain indeks unik global.
Dengan kombinasi ini, penulisan mungkin mengalami latensi lintas region, sementara kueri dengan lokasi yang ditentukan (dengan
WHERE location= @location) mendapatkan manfaat dari latensi intra-region dengan menggunakan indeks jarak jauh. Untuk kueri tanpa lokasi yang ditentukan, Spanner menggunakan pengoptimalan berbasis heuristik dengan menelusuri secara lokal terlebih dahulu. Jika data tidak ditemukan, data akan kembali ke indeks global.Jika Anda menggunakan region sewa baca dan memiliki replika hanya baca dari partisi default di region yang sama dengan data Anda, indeks jarak jauh tidak diperlukan karena region sewa baca sudah memberikan latensi baca kuat yang rendah untuk pembacaan indeks global.
Jika kueri Anda tidak menentukan lokasi dan kolom yang diindeks tidak unik secara global, buat hanya indeks global (tidak unik). Menambahkan indeks lokal atau jarak jauh tidak meningkatkan latensi baca dalam kasus ini karena Spanner tidak dapat menentukan apakah ada data yang cocok di penempatan lain, meskipun Spanner menemukan data di penempatan lokal.
Desain skema: Lokasi sebagai kunci utama
Jika kolom location berfungsi sebagai kunci utama dan kunci penempatan,
pemilihan indeks Anda didasarkan pada masalah latensi lintas dan apakah kueri Anda selalu menentukan lokasi atau tidak.
- Jika latensi lintas region tidak menjadi masalah, atau Anda memerlukan keunikan global, gunakan indeks global.
- Jika latensi lintas region menjadi masalah, kueri Anda selalu menyertakan lokasi, dan Anda tidak memerlukan Spanner untuk menerapkan keunikan global, gunakan indeks lokal saja. Hal ini memastikan latensi lokal untuk pembacaan dan penulisan.
Jika latensi kueri lintas-region menjadi masalah, latensi penulisan lintas-region dapat diterima, dan lokasi tidak selalu diketahui, maka strategi berikut berlaku:
Kondisi Rekomendasi Mengkueri berdasarkan kunci utama parsial yang unik secara global Buat indeks global unik untuk menerapkan keunikan. Indeks lokal tidak diperlukan karena kunci utama menjalankan fungsi yang serupa. Pengoptimalan berbasis heuristik berlaku. Pertama, Spanner memeriksa kunci primer lengkap dengan lokasi lokal sebelum melakukan failover ke indeks global.
Untuk melihat contohnya, lihat Indeks unik global pada kunci primer parsial.
Mengkueri berdasarkan kolom unik secara global non-kunci Buat indeks global unik untuk menerapkan keunikan.
Untuk latensi dalam wilayah, skenario berikut dapat terjadi:
- Buat indeks lokal pada kolom yang sama dengan indeks global. Pengoptimalan berbasis heuristik diterapkan. Kombinasi indeks global dan lokal memberikan latensi rendah untuk kueri yang sangat konsisten dan tidak valid dalam satu region, sementara penulisan dan kueri serta penulisan lintas region memiliki latensi lintas region.
-
Jika ada replika baca-tulis atau hanya baca dari partisi
default di region yang sama dengan data Anda, maka:
- Jika Anda hanya memerlukan latensi intra-region untuk pembacaan yang tidak terbaru, tetapi tidak untuk pembacaan yang kuat, maka Anda tidak memerlukan indeks lokal. Replika lokal memberikan latensi intra-region.
- Jika Anda memerlukan latensi dalam region untuk pembacaan yang kuat, Anda dapat membuat indeks lokal pada kolom yang sama dengan indeks global, atau menggunakan region sewa baca. Region sewa baca memberikan latensi baca kuat yang rendah dengan mengorbankan latensi tulis.
Kolom yang diindeks tidak unik secara global Buat indeks global saja. Indeks lokal tidak meningkatkan latensi baca karena Spanner mungkin perlu memeriksa semua lokasi.
Jika ketiga skenario ini tidak berlaku untuk kasus penggunaan Anda, Anda mungkin harus mengorbankan kesederhanaan aplikasi atau latensi penulisan dengan memberikan lokasi secara konsisten.
Desain skema: Nilai terkait lokasi sebagai kunci utama
Jika kunci utama tabel Anda didasarkan pada nilai terkait lokasi, tetapi bukan
langsung kolom kunci penempatan (misalnya, menggunakan country sebagai kunci
utama saat Anda memiliki lebih sedikit penempatan daripada negara), Anda dapat menggunakan indeks
global atau indeks lokal (disisipkan di bawah kolom country). Namun, indeks jarak jauh tidak didukung untuk tabel apa pun yang disisipkan di bawah tabel penempatan jenis ini.
Pengoptimalan berbasis heuristik tidak didukung untuk indeks lokal dalam skenario ini. Oleh karena itu, Anda hanya mencapai latensi lokal jika kueri Anda secara eksplisit menentukan awalan kunci utama.