Föderierte MySQL-Abfragen ausführen
Als Datenanalyst können Sie relationale Daten in MySQL direkt über BigQuery in Echtzeit abfragen, ohne Daten kopieren oder verschieben zu müssen.
Die BigQuery-MySQL-Föderation verwendet die BigQuery Connection API, um eine Verbindung zu MySQL-Datenbank-Engines herzustellen. Anschließend können Sie die Funktion EXTERNAL_QUERY verwenden, um Ihre SQL-Abfrage direkt zur Ausführung an MySQL zu senden. Die Ergebnisse werden dann direkt zurückgestreamt.
Beschränkungen
Für föderierte MySQL-Abfragen gelten die folgenden Einschränkungen:
- Sie können nur schreibgeschützte Abfragen über die Funktion
EXTERNAL_QUERYausführen. Anweisungen der Datendefinitionssprache (DDL) und der Datenbearbeitungssprache (DML) werden nicht unterstützt. - Der Zugriff auf die Föderation ist nur über die Funktion
EXTERNAL_QUERYmöglich. Das Erstellen von externen BigQuery-Tabellen oder permanenten Datasets, die direkt MySQL-Tabellen zugeordnet sind, wird nicht unterstützt. - Die Latenz föderierter Abfragen kann deutlich höher sein als die direkte Ausführung der Abfrage in MySQL.
- Der zugrunde liegende Verbindungsdienst kann inaktive Verbindungen in den Ruhezustand versetzen. Die erste Abfrage, die nach einer Inaktivitätsphase eine MySQL-Verbindung verwendet, kann mehr als eine Minute dauern, während der Connector initialisiert wird.
- DNS-Peering wird nicht unterstützt. Sie müssen eine Verbindung über eine IP-Adresse oder einen vollständig auflösbaren Hostnamen in Ihrem VPC-Netzwerk herstellen.
- In der MySQL-SQL-Abfrage müssen explizite Spalten-Aliasse für alle Spalten angegeben werden, die Funktionsergebnisse oder Ausdrücke enthalten (z. B.
SELECT COUNT(*) AS total_count). Ausdrücke ohne Alias erzeugen Spaltennamen mit Sonderzeichen, die in BigQuery-Tabellenschemadefinitionen ungültig sind. - Wenn die Nutzung der Compute Engine API im Abfrageprojekt durch VPC Service Controls eingeschränkt ist, schlägt die föderierte Abfrage fehl, wenn die Verbindung einen Netzwerkanhang verwendet. Achten Sie darauf, dass die entsprechenden Regeln für ein- und ausgehenden Traffic von VPC Service Controls konfiguriert sind.
Für MySQL werden keine zusätzlichen SQL-Push-downs unterstützt. Filter und Aggregationen in der äußeren BigQuery-Abfrage werden nicht in die innere Abfrage innerhalb der
EXTERNAL_QUERY-Funktion übertragen. Sie müssen Prädikate und Spaltenprojektionen direkt in der inneren MySQL-SQL-Anweisung angeben, um die Zeilen und Spalten zu begrenzen, die über das Netzwerk übertragen werden.Es wird nur die Authentifizierung mit MySQL-Datenbanknutzernamen und -passwort unterstützt. Externe Identitätsanbieter, Kerberos und die IAM-Authentifizierung von Cloud-Anbietern werden nicht unterstützt.
CREATE TABLE ... AS SELECT-Anweisungen (CTAS) schlagen mitUnsupported type INT32- oderUnsupported type FLOAT-Fehlern fehl, wenn die Abfrage 32-Bit-Ganzzahlspalten (TINYINT,SMALLINTundBOOLEAN/TINYINT(1)) oder Gleitkommaspalten mit einfacher Genauigkeit (FLOAT) auswählt. Wenn Sie Abfrageergebnisse in einer neuen BigQuery-Tabelle speichern möchten, wandeln Sie Ganzzahlspalten in Ihrer Abfrage explizit inINT64und Gleitkommaspalten inFLOAT64um:CREATE TABLE mydataset.mytable AS SELECT CAST(tiny_col AS INT64) AS tiny_col, CAST(small_col AS INT64) AS small_col, ... FROM EXTERNAL_QUERY(...);
Das Einfügen in eine vorhandene Tabelle mit
INSERT INTO <table> SELECT ...ist ohne manuelle Umwandlungen erfolgreich, da BigQuery die WerteINT32undFLOATautomatisch erweitert, damit sie den SpaltenINT64undFLOAT64der Zieltabelle entsprechen.Während die MySQL-Spalten
DECIMALundNUMERICaufBIGNUMERIC(76, 38)abgebildet werden, erlaubt MySQL eine Genauigkeit von bis zu 65. Wenn ein Wert mehr als 38 Ganzzahlziffern enthält (Precision minus Scale ist größer als 38), überschreitet er den Ganzzahlbereich vonBIGNUMERICund die Abfrage schlägt zur Laufzeit fehl. Wenn Sie Werte mit mehr als 38 Ganzzahlstellen abfragen möchten, wandeln Sie sie in derEXTERNAL_QUERY-Anweisung inCHARoderVARCHARum.Der Datentyp
TIMEschneidet Bruchteile von Sekunden (Mikrosekunden) auf ganze Sekunden ab (z. B. wird12:34:56.789123zu12:34:56). Außerdem unterstützt MySQLTIMEverstrichene Zeiträume von-838:59:59bis838:59:59, während BigQueryTIMEnur Tageszeitwerte von00:00:00bis23:59:59.999999unterstützt. Werte außerhalb von00:00:00bis23:59:59führen zu Laufzeitabfragefehlern. Wenn Mikrosekundenpräzision oder Werte für die verstrichene Dauer erforderlich sind, wandeln Sie die Spalte in derEXTERNAL_QUERY-Anweisung inCHARoderVARCHARum.Datums- und Zeitstempel vor dem 15. Oktober 1582 unterliegen aufgrund der historischen Umstellung auf den gregorianischen Kalender einer Verschiebung um 10 Tage. Wenn Sie genaue historische Daten vor 1582 beibehalten möchten, wandeln Sie sie in der
EXTERNAL_QUERY-Anweisung inCHARoderVARCHARum.
Unterstützte MySQL-Umgebungen und -Versionen
Föderierte Abfragen unterstützen MySQL-Datenbanken in den folgenden Bereitstellungsumgebungen:
- In der Cloud gehostete oder lokale MySQL-Datenbanken, die über öffentliche IP-Adressen oder Netzwerkanhänge (über Cloud VPN oder Cloud Interconnect) zugänglich sind
- Selbst gehostete MySQL-Instanzen in Compute Engine oder einer anderen Infrastruktur
- MySQL 8.4 LTS und 8.0
Hinweis
Achten Sie darauf, dass Ihr BigQuery-Administrator eine MySQL-Verbindung erstellt und für Sie freigegeben hat.
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle BigQuery-Verbindungsnutzer (roles/bigquery.connectionUser) für das Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Abfragen von MySQL benötigen.
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.
Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.
Daten abfragen
Verwenden Sie die Funktion EXTERNAL_QUERY, um eine föderierte Abfrage aus einer GoogleSQL-Abfrage an MySQL zu senden.
Das folgende Beispiel ist eine föderierte Abfrage, die Kundendatensätze in BigQuery mit dem Namen mydataset.customers mit Transaktionsaufträgen in MySQL verknüpft:
SELECT c.customer_id, c.name, fo.first_order_date FROM mydataset.customers AS c LEFT OUTER JOIN EXTERNAL_QUERY( 'projects/my-project/locations/us-central1/connections/mysql_prod_conn', '''SELECT CUSTOMER_ID, MIN(ORDER_DATE) AS first_order_date FROM ORDERS GROUP BY CUSTOMER_ID''') AS fo ON fo.customer_id = c.customer_id GROUP BY c.customer_id, c.name, fo.first_order_date;
MySQL-Tabellenschema ansehen
Sie können die MySQL-INFORMATION_SCHEMA-Ansichten über EXTERNAL_QUERY abfragen, um Datenbankmetadaten zu prüfen, Tabellen zu finden und Spaltenschemas zu überprüfen, bevor Sie Analysen ausführen.
Alle Datenbanken auflisten
SELECT * FROM EXTERNAL_QUERY( 'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID', '''SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.SCHEMATA''');
Tabellen in einer Datenbank auflisten
SELECT * FROM EXTERNAL_QUERY( 'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID', """SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'DATABASE_NAME'""");
Spalten und Datentypen in einer Tabelle ansehen
SELECT * FROM EXTERNAL_QUERY( 'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID', """SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'DATABASE_NAME' AND TABLE_NAME = 'TABLE_NAME'""");
Datentypzuordnung
Wenn Sie eine föderierte Abfrage ausführen, konvertiert BigQuery die Daten aus MySQL gemäß der folgenden Tabelle in GoogleSQL-Datentypen:
| MySQL-Datentyp | BigQuery-Datentyp |
|---|---|
| Numerische Typen | |
BOOLEAN, BOOL, TINYINT(1) |
INT64 (interaktive Abfragen; siehe Einschränkungen für CREATE TABLE ... AS SELECT) |
TINYINT, SMALLINT |
INT64 (interaktive Abfragen; siehe Einschränkungen für CREATE TABLE ... AS SELECT) |
MEDIUMINT, INT, INTEGER |
INT64 |
BIGINT |
INT64 |
BIGINT UNSIGNED, BIGINT ZEROFILL, SERIAL |
BIGNUMERIC(76, 38) |
DECIMAL, DEC, NUMERIC, FIXED |
BIGNUMERIC(76, 38) |
FLOAT |
FLOAT64 (interaktive Abfragen; siehe Einschränkungen für CREATE TABLE ... AS SELECT) |
DOUBLE, DOUBLE PRECISION, REAL |
FLOAT64 |
| Datums- und Uhrzeittypen | |
DATE |
DATE |
DATETIME |
DATETIME |
TIMESTAMP |
TIMESTAMP |
TIME |
TIME |
| String- und Texttypen | |
CHAR |
STRING |
VARCHAR |
STRING |
BINARY |
BYTES |
VARBINARY |
BYTES |
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB |
BYTES |
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT |
STRING |
ENUM |
STRING |
SET |
STRING |
Preise
Die Kosten für die Ausführung einer föderierten Abfrage hängen von drei Faktoren ab:
- Die Rechenkosten für die Ausführung der Abfrage in MySQL (werden von Ihrem MySQL-Datenbankanbieter oder Ihrer Hosting-Umgebung in Rechnung gestellt)
- Die Bandbreitenkosten für die Übertragung der Abfrageergebnisse von MySQL zu BigQuery (Gebühren für ausgehenden Traffic von Ihrem Datenbankhostanbieter)
- Die Rechenkosten für die Ausführung der Abfrage in BigQuery
Alle MySQL-Computing- und ausgehenden Traffic-Kosten werden direkt von Ihrem MySQL-Anbieter oder Infrastrukturhost in Rechnung gestellt, nicht von Google. Um die Bandbreitenkosten zu begrenzen, empfehlen wir, die Abfrage in der EXTERNAL_QUERY-Anweisung so zu schreiben, dass alle Spalten und Zeilen ausgeschlossen werden, die nicht für die Berechnung des Endergebnisses erforderlich sind.
Für die Ausführung föderierter Abfragen in BigQuery fallen keine zusätzlichen Kosten an. Weitere Informationen zu den Preisen von BigQuery finden Sie unter Preise.
Wenn Ihre Verbindung Netzwerkkomponenten von Google Cloud verwendet, können auch die folgenden Preise gelten:
Nächste Schritte
- Verbindung mit MySQL herstellen
- Informationen zu föderierten Abfragen
- Verbindungen verwalten