Asynchrone Abfragen für sekundäre Indexe

Dieses Dokument enthält Beispiele für gängige Abfragemuster zum Erstellen asynchroner sekundärer Indexe in Bigtable. In den Beispielen werden IDs und Werte verwendet, die denen in Daten für Beispiele ähneln. Sie können eine Testtabelle erstellen, um die Abfragen zu testen.

Bevor Sie diese Seite lesen, sollten Sie sich mit den Informationen unter Asynchronen sekundären Index erstellen und GoogleSQL für Bigtablevertraut machen.

Beispielabfragen

In den folgenden Beispielen wird gezeigt, wie Sie mit verschiedenen GoogleSQL-Abfragen asynchrone sekundäre Indexe erstellen.

Umgekehrten Index basierend auf einem Spaltenqualifizierer und Werten erstellen

Die folgende Abfrage erstellt einen umgekehrten Index, indem alle Schlüssel/Wert-Paare aus einer Spaltenfamilie mit einem flexiblen Schema extrahiert werden. Mit MAP_ENTRIES wird ein Array aller Daten abgerufen, die in der Spaltenfamilie stats_summary gespeichert sind. Anschließend werden mit UNNEST alle Schlüssel/Wert-Paare in eine separate Zeile umgewandelt. Der resultierende Index ermöglicht schnelle Suchvorgänge basierend auf stat_description und stat_value. Wenn Sie der Quelltabelle neue Statistiktypen hinzufügen, Bigtable diese automatisch in den asynchronen Index aufgenommen.

SELECT
 stats.key as stat_description,
 stats.value as stat_value,
 _key as original_key,
 cell_plan as cell_plan
FROM test_table
CROSS JOIN UNNEST(MAP_ENTRIES(stats_summary)) stats
ORDER BY stat_description, stat_value, original_key

Dadurch hat jedes Schlüssel/Wert-Paar aus der ursprünglichen Spaltenfamilie stats_summary eine eigene Zeile in der kontinuierlichen materialisierten Ansicht:

stat_description (Schlüssel) stat_value (Schlüssel) original_key (Schlüssel) cell_plan
connected_cell "2" phone#4c410523#20190501 { "data_plan_01gb": "true", "data_plan_05gb": "false" }
os_build PQ2A.190401.002 phone#5c10102#20190501 { "data_plan_10gb": "false" }

Wenn Sie schnell nach Daten suchen möchten, die von Bigtable als Werte erfasst wurden, verwenden Sie die neuen Zeilenschlüssel, um die Daten abzufragen. Ein Beispiel:

SELECT cell_plan, original_key
FROM `mv_inverted_index`
WHERE stat_description = "connected_cell"
AND stat_value = "2"

Neuen Zeilenschlüssel basierend auf vorhandenen Daten erstellen

Im folgenden Beispiel wird ein neuer Indexschlüssel, total_plan_capacity, erstellt, indem Datentarife kategorisiert werden, die in der Spaltenfamilie cell_plan gespeichert sind. Mit MAP_KEYS werden alle Schlüssel in cell_plan abgerufen und mit ARRAY_INCLUDES_ANY nach bestimmten Datentarifschlüsseln gefiltert. Eine CASE-Anweisung definiert dann die Logik zum Zuweisen einer total_plan_capacity-Kategorie, die auf dem Vorhandensein und den Werten dieser Datentarife basiert. So können Sie effizient nach der kombinierten Datentarifkapazität suchen.

SELECT
 CASE
    WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "false" OR cell_plan['data_plan_05gb'] IS NULL)
     AND (cell_plan['data_plan_10gb'] = "false" OR cell_plan['data_plan_10gb'] IS NULL)
   THEN 'x-small'

   WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "true")
     AND (cell_plan['data_plan_10gb'] = "false" OR cell_plan['data_plan_10gb'] IS NULL)
   THEN 'small'

   WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "false" OR cell_plan['data_plan_05gb'] IS NULL)
     AND (cell_plan['data_plan_10gb'] = "true")
   THEN 'medium'

   WHEN
     (cell_plan['data_plan_01gb'] = "false" OR cell_plan['data_plan_01gb'] IS NULL)
     AND (cell_plan['data_plan_05gb'] = "true")
     AND (cell_plan['data_plan_10gb'] = "true")
   THEN 'large'

   WHEN
     cell_plan['data_plan_01gb'] = "true"
     AND (cell_plan['data_plan_05gb'] = "true")
     AND (cell_plan['data_plan_10gb'] = "true")
   THEN 'x-large'
 END as total_plan_capacity,
 _key as original_key,
 stats_summary
FROM test_table
WHERE ARRAY_INCLUDES_ANY(MAP_KEYS(cell_plan), ["data_plan_01gb", "data_plan_05gb","data_plan_10gb"])
ORDER BY total_plan_capacity, original_key

Zeitreihenbasierten Index erstellen

Bigtable speichert jeden Zellenwert und den zugehörigen Zeitstempel. Mit dem WITH_HISTORY=>TRUE Flag in der FROM Klausel können Sie alle Versionen der Daten und ihre Zeitstempel abrufen. Die Tabellenfunktion UNPACK erweitert dann die Abfrageergebnisse, sodass jeder mit einem Zeitstempel versehene Wert in einer eigenen Zeile mit einer separaten Spalte _timestamp angezeigt wird. So können Sie einen asynchronen sekundären Index erstellen, bei dem der neue Zeilenschlüssel auf diesen Zeitstempelwerten basiert. Das ermöglicht schnelle Suchvorgänge basierend auf Zeiträumen.

SELECT
 _timestamp as stats_timestamp,
 _key as original_key,
 stats_summary
FROM UNPACK((
 select
   _key,
   stats_summary
  FROM
 test_table (WITH_HISTORY=>TRUE)
))
ORDER BY stats_timestamp, original_key

Indexeintrag für Elemente und Werte in einer JSON-Zelle erstellen

Bigtable wird häufig als Schlüssel/Wert-Speicher für umfangreiche Arbeitslasten verwendet, einschließlich Daten in Formaten wie JSON. Im folgenden Beispiel wird gezeigt, wie Sie einen asynchronen sekundären Index erstellen, um schnell nach Daten zu suchen, die in JSON gespeichert sind. Mit JSON_EXTRACT wird die store_id aus einem JSON-String in der Spaltenfamilie transaction_information in einer Tabelle mit dem Namen sales extrahiert. Dieser Index ermöglicht den schnellen Abruf von Verkaufstransaktionen nach bestimmten Filial-IDs.

SELECT
JSON_EXTRACT(transaction_information["json"], "$.store_id") as store_id,
_key as original_key,
transaction_information
from sales
ORDER BY store_id, original_key;

Nächste Schritte