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 clausolaSELECT
. - 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 clausolaORDER 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
- Query vista materializzata continue
- Creare e gestire viste materializzate continue
- Best practice per la progettazione dello schema
- Gestire chiave di riga di riga
- Conteggio distribuito in Bigtable