Crea un indice secondario globale

Puoi utilizzare le viste materializzate continue come indici secondari globali per le tabelle.

Prima di leggere questa pagina, acquisisci familiarità con le viste materializzate continue.

I dati in una tabella Bigtable sono in genere indicizzati dalle chiavi di riga. Tuttavia, puoi creare una vista materializzata continua da una tabella di origine e utilizzarla come indice secondario globale. In questo modo puoi recuperare gli stessi dati utilizzando diversi pattern di ricerca delle query eseguendo query sulla vista materializzata.

Un indice secondario globale è una vista materializzata continua che contiene un sottoinsieme di colonne di una tabella di origine, insieme a una chiave di riga diversa da quella della tabella di origine. Queste chiavi di riga potrebbero basarsi sulle seguenti trasformazioni che consentono alla tua applicazione di recuperare gli stessi dati in base a diversi pattern di ricerca delle query:

  • Attributi all'interno della tabella di origine, ad esempio qualificatori di colonna, valori di colonna o parti della chiave di riga di origine.
  • Una riformattazione della chiave di riga.
  • Una trasformazione che combina la chiave di riga con un attributo.

Bigtable sincronizza automaticamente gli indici secondari globali con la tabella di origine in modo alla fine coerente.

Quando utilizzare un indice secondario globale

Le applicazioni spesso devono eseguire query sugli stessi dati utilizzando diversi pattern di ricerca o attributi. Ad esempio, considera un'applicazione che recupera le informazioni dell'utente tramite l'indirizzo email o un numero di telefono. Potresti volere lo stesso livello di prestazioni per entrambi i pattern di query. Se imposti l'indirizzo email come chiave di riga Bigtable e memorizzi i numeri di telefono in una colonna, le prestazioni della ricerca del numero di telefono sono più lente perché richiedono una scansione completa della tabella.

Per migliorare il rendimento delle query durante la ricerca per numero di telefono, puoi creare una vista materializzata continua con un'istruzione SQL. L'istruzione SQL indica a Bigtable come ristrutturare i dati con una chiave di riga diversa. Una vista materializzata continua funge da tabella su cui puoi eseguire query. Poi utilizzi la vista come indice secondario globale. Offre alla tua applicazione un altro percorso di accesso agli stessi dati. Ogni percorso utilizza una chiave di riga diversa, quindi puoi scegliere un percorso alternativo per ogni query. Per scegliere il percorso migliore per la tua query, comprendi la struttura della chiave di riga per ogni tabella e i dati archiviati in ciascuna tabella.

L'utilizzo di una vista materializzata continua come indice secondario globale può migliorare le prestazioni delle query nei seguenti casi d'uso:

  • Riassegnazione delle chiavi ai dati: se devi eseguire query sui tuoi dati utilizzando una chiave diversa da quelle delle righe della tabella di origine, puoi creare una vista materializzata continua con la chiave alternativa ed eseguire query su questa vista.
  • Filtro dei dati: se vuoi filtrare la tabella di origine e compilare solo righe di dati specifiche nell'indice secondario globale, fornisci una clausola WHERE nella query SQL che definisce la visualizzazione.
  • Chiavi attributo: se devi eseguire query sui dati in base a un attributo non chiave, ad esempio un qualificatore o un valore di colonna, puoi includerlo nella clausola ORDER BY.

Informazioni sugli indici secondari globali

Per utilizzare una vista materializzata continua in Bigtable come indice secondario globale, tieni presente i seguenti requisiti:

  • La chiave di riga per un nuovo indice secondario globale deve includere la chiave di riga della tabella di origine per garantire una mappatura uno a uno tra le righe della tabella di origine e le righe dell'indice secondario globale della vista materializzata continua.
  • L'indice secondario globale non deve avere lo stesso schema o gli stessi attributi della tabella di origine. Nella parte SELECT della query SQL, devi specificare le colonne della tabella necessarie e le trasformazioni SQL dei dati che vuoi applicare.
  • L'indice secondario globale deve copiare solo i dati necessari per il pattern di query. Non è necessario fornire tutti i dati di origine nella tabella di origine.
  • In Bigtable, la chiave di riga che scegli fornisce l'ordinamento predefinito.

Per eseguire query sugli indici secondari globali, tieni presente i seguenti requisiti:

  • Ogni colonna della clausola ORDER BY deve essere inclusa anche nella clausola SELECT.
  • Una volta definito l'indice secondario globale, l'applicazione deve essere in grado di scegliere tra l'interrogazione della tabella di origine o della vista materializzata che rappresenta l'indice secondario globale.
  • Le applicazioni non scrivono direttamente nell'indice, che si sincronizza continuamente con la tabella di origine. Scrivi sempre nella tabella di origine.
  • L'indice secondario globale è coerente nel tempo: i dati vengono scritti prima nella tabella di origine e poi trasformati nel formato dell'indice secondario globale.
  • Ti consigliamo di creare un indice di copertura. Per saperne di più, consulta la sezione Indici di copertura di questo documento.
  • La clausola ORDER BY deve contenere la chiave di riga non modificata della tabella di origine e tutti i dati devono essere ordinati in ordine crescente. La chiave di riga nella tabella di origine viene sempre proiettata nella vista materializzata, ma può essere combinata con altri attributi.
  • Le colonne nella clausola ORDER BY diventano parte della chiave di riga strutturata dell'indice secondario globale. Tutte le altre colonne selezionate diventano valori di colonne non chiave nell'indice secondario globale. Se converti un valore nella clausola ORDER BY in un tipo di dati GoogleSQL per Bigtable specifico, questo mantiene il tipo di dati nella chiave di riga strutturata dell'indice secondario globale.

Indici di copertura

Un indice di copertura include tutte le colonne necessarie per le query. Quando esegui una query su un indice di copertura, Bigtable può recuperare tutti i dati richiesti direttamente dall'indice, senza dover accedere alla tabella di origine. Consigliamo questo approccio per prestazioni ottimali perché riduce al minimo il numero di letture del disco. Per creare un indice di copertura, assicurati che l'istruzione SELECT specifichi tutte le colonne necessarie nelle query.

Quando vuoi creare un indice non di copertura, esegui una query sull'indice e poi utilizza i risultati per cercare le colonne aggiuntive di cui hai bisogno nella tabella di origine.

Definisci un indice secondario globale

Crea un indice secondario globale creando una vista materializzata continua con una query SQL che definisce l'indice secondario globale.

Nell'esempio seguente, la query SQL crea un indice secondario globale che consente di eseguire query sui dati delle interazioni degli utenti. La clausola ORDER BY definisce la chiave di riga strutturata dell'indice secondario globale, utilizzando una combinazione di numero di telefono, ID utente e indirizzo email dell'utente. Assegna anche il nome interactions alla famiglia di colonne activity:

SELECT
  user['phone'] AS phone,
  CAST(user['id'] AS INT64) AS user_id,
  _key AS email,
  activity AS interactions
FROM CLICKS_TABLE
ORDER BY 1, 2, 3;

La seguente tabella spiega come viene creato l'indice confrontando la visualizzazione della stessa riga nella tabella di origine con l'indice secondario globale corrispondente:

Riga della tabella di origine Riga dell'indice secondario globale
Chiave riga:
_key: user1@example.com



Attributi:
user: {id: "123", phone: "555-123-4567"}
activity: {action: "CLICKED_PRODUCT_A"}
Chiave di riga strutturata:
phone: 555-123-4567
user_id: 123
email: user1@example.com

Attributo:
interactions: {action: "CLICKED_PRODUCT_A"}
Chiave riga:
_key: user2@example.com



Attributi:
user: {id: "456", phone: "555-987-6543"}
activity: {action: "VIEWED_PRODUCT_B"}
Chiave di riga strutturata:
phone: 555-987-6543
user_id: 456
email: user2@example.com

Attributo:
interactions: {action: "VIEWED_PRODUCT_B"}
Chiave riga:
_key: user3@example.com



Attributi:
user: {id: "1000", phone: "555-111-2222"}
activity: {action: "ADDED_TO_CART_PRODUCT_C"}
Chiave di riga strutturata:
phone: 555-111-2222
user_id: 1000
email: user3@example.com

Attributo:
interactions: {action: "ADDED_TO_CART_PRODUCT_C"}

Limitazioni

  • Per leggere la chiave di output, ovvero la chiave dell'indice secondario globale, puoi utilizzare solo query SQL.

Passaggi successivi