Indici e partizionamento geografico

Spanner offre diversi tipi di indici per migliorare le prestazioni delle query. La scelta del tipo di indice corretto per lo schema e i pattern di query è fondamentale, soprattutto per i database che utilizzano il partizionamento geografico. Questa pagina descrive i vantaggi dei diversi tipi di indice e le best practice per la selezione e l'utilizzo degli indici Spanner con il partizionamento geografico.

Tipi di indice

Spanner supporta gli indici globali, locali e remoti. Ogni tipo ha caratteristiche di rendimento e casi d'uso diversi. Per i database con partizionamento geografico, è importante comprendere questi tipi di indice. La scelta dell'indice giusto ti aiuta a ottimizzare lo schema e le query del database, il che può migliorare significativamente la latenza del database partizionato geograficamente. Per i database che non utilizzano il partizionamento geografico, è meno importante comprendere questi tipi di indice perché sono tutti archiviati nel posizionamento predefinito e hanno caratteristiche di rendimento simili.

Indici globali

Un indice globale è il tipo di indice predefinito in Spanner. I dati dell'indice vengono archiviati nella partizione predefinita, che potrebbe non essere colocalizzata con i dati della tabella. La creazione di indici globali su tabelle con partizionamento geografico potrebbe comportare latenze di scrittura notevolmente più elevate per le scritture che coinvolgono le colonne indicizzate, soprattutto se il quorum di scrittura predefinito della partizione per l'indice è molto lontano dal quorum di scrittura delle righe della tabella in fase di scrittura. Puoi ridurre le latenze di lettura degli indici globali utilizzando repliche di sola lettura nelle vicinanze insieme a regioni di lease di lettura o letture non aggiornate.

Gli indici globali hanno le seguenti caratteristiche:

  • Accelerano le query che altrimenti richiederebbero una scansione completa della tabella e impongono l'unicità in tutte le righe della tabella, indipendentemente dalla posizione.
  • Sono adatti a colonne che richiedono valori univoci in un database.
  • Velocizzano le query che filtrano o ordinano in base alle colonne indicizzate.

Di seguito è riportato un esempio di indice univoco globale:

CREATE UNIQUE INDEX idx_customer_email ON customer(email);

Indici locali

Un indice locale è intercalato nella gerarchia principale della tabella indicizzata. I nomi e i tipi delle colonne della chiave primaria devono corrispondere a quelli della tabella indicizzata.

Gli indici locali hanno le seguenti caratteristiche:

  • Memorizzano i dati dell'indice nella stessa partizione dei dati indicizzati. La latenza di scrittura è soggetta al quorum di scrittura del posizionamento specifico, non al quorum di scrittura del posizionamento predefinito.

  • Offrono la latenza più bassa per le query che hanno come target un prefisso di chiave specifico, perché sia l'indice sia i dati della tabella si trovano nello stesso posizionamento.

Per creare un indice locale, inserisci l'indice nella tabella padre. Se utilizzi un indice locale UNIQUE, l'unicità viene applicata solo all'interno di una determinata riga principale, non all'intera tabella.

Di seguito è riportato un esempio di creazione di un indice locale nella tabella customer, interleaved nella tabella padre 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;