Globalen sekundären Index erstellen

Sie können kontinuierliche materialisierte Ansichten als globale sekundäre Indexe für Tabellen verwenden.

Bevor Sie diese Seite lesen, sollten Sie sich mit Kontinuierliche materialisierte Ansichten vertraut machen.

Daten in einer Bigtable-Tabelle werden in der Regel nach Zeilenschlüsseln indexiert. Sie können jedoch eine kontinuierliche materialisierte Ansicht aus einer Quelltabelle erstellen und als globalen sekundären Index verwenden. So können Sie dieselben Daten mit verschiedenen Abfragemustern abrufen, indem Sie die materialisierte Ansicht abfragen.

Ein globaler sekundärer Index ist eine kontinuierliche materialisierte Ansicht, die eine Teilmenge der Spalten aus einer Quelltabelle sowie einen Zeilenschlüssel enthält, der sich vom Zeilenschlüssel in der Quelltabelle unterscheidet. Diese Zeilenschlüssel können auf den folgenden Transformationen basieren, mit denen Ihre Anwendung dieselben Daten anhand verschiedener Suchmuster abrufen kann:

  • Attribute in der Quelltabelle, z. B. Spaltenqualifizierer, Spaltenwerte oder Teile des Quellzeilenschlüssels.
  • Eine Neuformatierung des Zeilenschlüssels.
  • Eine Transformation, die den Zeilenschlüssel mit einem Attribut kombiniert.

Bigtable synchronisiert globale sekundäre Indexe automatisch mit der Quelltabelle. Die Synchronisierung ist letztendlich konsistent.

Wann sollte ein globaler sekundärer Index verwendet werden?

Anwendungen müssen oft dieselben Daten mit unterschiedlichen Suchmustern oder Attributen abfragen. Nehmen wir beispielsweise eine Anwendung, die Nutzerinformationen entweder über die E-Mail-Adresse oder über eine Telefonnummer abruft. Möglicherweise möchten Sie, dass beide Abfragemuster die gleiche Leistung erbringen. Wenn Sie die E‑Mail-Adresse als Bigtable-Zeilenschlüssel verwenden und Telefonnummern in einer Spalte speichern, ist die Leistung der Telefonnummernsuche langsamer, da ein vollständiger Tabellenscan erforderlich ist.

Um die Abfrageleistung bei der Suche nach einer Telefonnummer zu verbessern, können Sie eine kontinuierliche materialisierte Ansicht mit einer SQL-Anweisung erstellen. Die SQL-Anweisung weist Bigtable an, wie Ihre Daten mit einem anderen Zeilenschlüssel umstrukturiert werden sollen. Eine kontinuierliche materialisierte Ansicht verhält sich wie eine Tabelle, die Sie abfragen können. Anschließend verwenden Sie die Ansicht als globalen sekundären Index. Dadurch erhält Ihre Anwendung einen weiteren Zugriffspfad zu denselben Daten. Für jeden Pfad wird ein anderer Zeilenschlüssel verwendet. Sie können also für jede Anfrage einen alternativen Pfad auswählen. Um den besten Pfad für Ihre Abfrage auszuwählen, müssen Sie die Struktur des Zeilenschlüssels für jede Tabelle und die Daten, die in jeder Tabelle gespeichert sind, kennen.

Die Verwendung einer kontinuierlichen materialisierten Ansicht als globaler sekundärer Index kann die Abfrageleistung in den folgenden Anwendungsfällen verbessern:

  • Daten neu verschlüsseln: Wenn Sie Ihre Daten mit einem anderen Schlüssel als den Zeilenschlüsseln der Quelltabelle abfragen müssen, können Sie eine kontinuierliche materialisierte Ansicht mit dem alternativen Schlüssel erstellen und Abfragen für diese Ansicht ausführen.
  • Daten filtern: Wenn Sie die Quelltabelle filtern und nur bestimmte Datenzeilen im globalen sekundären Index einfügen möchten, geben Sie in der SQL-Abfrage, die die Ansicht definiert, eine WHERE-Klausel an.
  • Attributschlüssel: Wenn Sie Ihre Daten anhand eines Attributs abfragen müssen, das kein Schlüssel ist, z. B. ein Spaltenqualifizierer oder -wert, können Sie es in Ihre ORDER BY-Klausel aufnehmen.

Globale sekundäre Indexe

Wenn Sie eine kontinuierliche materialisierte Ansicht in Bigtable als globalen sekundären Index verwenden möchten, müssen Sie die folgenden Anforderungen erfüllen:

  • Der Zeilenschlüssel für einen neuen globalen sekundären Index muss den Zeilenschlüssel der Quelltabelle enthalten, um eine 1:1-Zuordnung zwischen Zeilen in der Quelltabelle und Zeilen im globalen sekundären Index der kontinuierlichen materialisierten Ansicht zu gewährleisten.
  • Der globale sekundäre Index muss nicht dasselbe Schema oder dieselben Attribute wie die Quelltabelle haben. Im SELECT-Teil der SQL-Abfrage müssen Sie angeben, welche Spalten aus der Tabelle erforderlich sind und welche SQL-Transformationen der Daten Sie anwenden möchten.
  • In den globalen sekundären Index müssen nur Daten kopiert werden, die für das Abfragemuster erforderlich sind. Es ist nicht erforderlich, alle Quelldaten in der Quelltabelle anzugeben.
  • In Bigtable wird die Standardsortierreihenfolge durch den von Ihnen ausgewählten Zeilenschlüssel bestimmt.

Wenn Sie globale sekundäre Indexe abfragen möchten, müssen Sie die folgenden Anforderungen beachten:

  • Jede Spalte in der ORDER BY-Anweisung muss auch in der SELECT-Anweisung enthalten sein.
  • Nachdem Sie den globalen sekundären Index definiert haben, muss Ihre Anwendung in der Lage sein, zwischen dem Abfragen der Quelltabelle oder der materialisierten Ansicht, die den globalen sekundären Index darstellt, zu wählen.
  • Anwendungen schreiben nicht direkt in den Index, der kontinuierlich mit der Quelltabelle synchronisiert wird. Schreiben Sie immer in die Quelltabelle.
  • Der globale sekundäre Index ist letztendlich konsistent. Daten werden zuerst in die Quelltabelle geschrieben und dann in das Format des globalen sekundären Index transformiert.
  • Wir empfehlen, einen Covering-Index zu erstellen. Weitere Informationen finden Sie im Abschnitt Abdeckende Indexe in diesem Dokument.
  • Die ORDER BY-Klausel muss den unveränderten Zeilenschlüssel der Quelltabelle enthalten und alle Daten müssen in aufsteigender Reihenfolge sortiert sein. Der Zeilenschlüssel in der Quelltabelle wird immer in die materialisierte Ansicht projiziert. Er kann jedoch mit anderen Attributen kombiniert werden.
  • Die Spalten in der ORDER BY-Klausel werden Teil des strukturierten Zeilenschlüssels des globalen sekundären Index. Alle anderen ausgewählten Spalten werden zu Nicht-Schlüsselspaltenwerten im globalen sekundären Index. Wenn Sie einen Wert in der ORDER BY-Klausel in einen bestimmten GoogleSQL for Bigtable-Datentyp konvertieren, behält er seinen Datentyp im strukturierten Zeilenschlüssel des globalen sekundären Index bei.

Abdeckende Indexe

Ein abdeckender Index enthält alle Spalten, die für Ihre Abfragen erforderlich sind. Wenn Sie einen Covering-Index abfragen, kann Bigtable alle erforderlichen Daten direkt aus dem Index abrufen, ohne auf die Quelltabelle zugreifen zu müssen. Diese Methode wird für eine optimale Leistung empfohlen, da sie die Anzahl der Lesezugriffe auf die Festplatte minimiert. Wenn Sie einen Covering-Index erstellen möchten, müssen Sie darauf achten, dass in Ihrer SELECT-Anweisung alle Spalten angegeben sind, die Sie für Ihre Abfragen benötigen.

Wenn Sie einen nicht abdeckenden Index erstellen möchten, fragen Sie den Index ab und verwenden Sie die Ergebnisse dann, um die zusätzlichen Spalten zu suchen, die Sie aus der Quelltabelle benötigen.

Globalen sekundären Index definieren

Sie erstellen einen globalen sekundären Index, indem Sie eine kontinuierliche materialisierte Ansicht mit einer SQL-Abfrage erstellen, die den globalen sekundären Index definiert.

Im folgenden Beispiel wird mit der SQL-Abfrage ein globaler sekundärer Index erstellt, mit dem Sie Daten zu Nutzerinteraktionen abfragen können. Die ORDER BY-Klausel definiert den strukturierten Zeilenschlüssel des globalen sekundären Index. Dazu wird eine Kombination aus der Telefonnummer, der Nutzer-ID und der E-Mail-Adresse des Nutzers verwendet. Außerdem wird der Spaltenfamilie activity der Name interactions zugewiesen:

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;

In der folgenden Tabelle wird erläutert, wie der Index erstellt wird. Dazu wird die Ansicht derselben Zeile in der Quelltabelle mit dem entsprechenden globalen sekundären Index verglichen:

Quelltabellenzeile Zeile des globalen sekundären Index
Zeilenschlüssel:
_key: user1@example.com



Attribute:
user: {id: "123", phone: "555-123-4567"}
activity: {action: "CLICKED_PRODUCT_A"}
Strukturierter Zeilenschlüssel:
phone: 555-123-4567
user_id: 123
email: user1@example.com

Attribute:
interactions: {action: "CLICKED_PRODUCT_A"}
Zeilenschlüssel:
_key: user2@example.com



Attribute:
user: {id: "456", phone: "555-987-6543"}
activity: {action: "VIEWED_PRODUCT_B"}
Strukturierter Zeilenschlüssel:
phone: 555-987-6543
user_id: 456
email: user2@example.com

Attribute:
interactions: {action: "VIEWED_PRODUCT_B"}
Zeilenschlüssel:
_key: user3@example.com



Attribute:
user: {id: "1000", phone: "555-111-2222"}
activity: {action: "ADDED_TO_CART_PRODUCT_C"}
Strukturierter Zeilenschlüssel:
phone: 555-111-2222
user_id: 1000
email: user3@example.com

Attribute:
interactions: {action: "ADDED_TO_CART_PRODUCT_C"}

Beschränkungen

  • Zum Lesen des Ausgabeschlüssels, der der Schlüssel des globalen sekundären Index ist, können Sie nur SQL-Abfragen verwenden.

Nächste Schritte