Menjalankan kueri gabungan MySQL
Sebagai analis data, Anda dapat membuat kueri data relasional yang ada di MySQL langsung dari BigQuery secara real time, tanpa menyalin atau memindahkan data.
Federasi MySQL BigQuery menggunakan BigQuery Connection API untuk terhubung ke mesin database MySQL. Kemudian, Anda dapat menggunakan fungsi EXTERNAL_QUERY untuk mengirim kueri SQL langsung ke MySQL untuk dieksekusi, dan hasilnya akan di-streaming langsung kembali.
Batasan
Kueri gabungan MySQL tunduk pada batasan berikut:
- Anda hanya dapat menjalankan kueri hanya baca melalui fungsi
EXTERNAL_QUERY. Pernyataan bahasa definisi data (DDL) dan bahasa pengolahan data (DML) tidak didukung. - Federasi hanya dapat diakses melalui fungsi
EXTERNAL_QUERY. Pembuatan tabel eksternal atau set data permanen BigQuery yang langsung dipetakan ke tabel MySQL tidak didukung. - Latensi kueri gabungan mungkin jauh lebih tinggi daripada menjalankan kueri langsung di MySQL.
- Layanan koneksi yang mendasarinya mungkin menghibernasi koneksi yang tidak aktif. Kueri pertama yang menggunakan koneksi MySQL setelah periode tidak aktif mungkin memerlukan waktu lebih dari satu menit untuk dijalankan saat konektor melakukan inisialisasi.
- Peering DNS tidak didukung. Anda harus terhubung menggunakan alamat IP atau nama host yang dapat di-resolve sepenuhnya dalam jaringan VPC Anda.
- Kueri SQL MySQL harus menentukan alias kolom eksplisit untuk setiap kolom yang berisi hasil atau ekspresi fungsi (misalnya,
SELECT COUNT(*) AS total_count). Ekspresi tanpa alias menghasilkan nama kolom dengan karakter khusus yang tidak valid dalam definisi skema tabel BigQuery. - Jika penggunaan Compute Engine API dalam project kueri dibatasi oleh Kontrol Layanan VPC, kueri gabungan akan gagal jika koneksi menggunakan lampiran jaringan. Pastikan aturan ingress dan egress Kontrol Layanan VPC yang sesuai telah dikonfigurasi.
Tidak ada pushdown SQL tambahan yang didukung untuk MySQL. Filter dan agregasi dalam kueri BigQuery luar tidak didorong ke kueri dalam di dalam fungsi
EXTERNAL_QUERY. Anda harus menentukan predikat dan proyeksi kolom langsung di dalam pernyataan SQL MySQL internal untuk membatasi baris dan kolom yang ditransfer di seluruh jaringan.Hanya autentikasi nama pengguna dan sandi database MySQL yang didukung. Penyedia identitas pihak ketiga, Kerberos, dan autentikasi IAM penyedia cloud tidak didukung.
Pernyataan
CREATE TABLE ... AS SELECT(CTAS) gagal dengan errorUnsupported type INT32atauUnsupported type FLOATjika kueri memilih kolom bilangan bulat 32-bit (TINYINT,SMALLINT, danBOOLEAN/TINYINT(1)) atau kolom float presisi tunggal (FLOAT). Untuk menyimpan hasil kueri ke dalam tabel BigQuery baru, transmisikan kolom bilangan bulat secara eksplisit keINT64dan kolom float keFLOAT64dalam kueri Anda: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(...);
Penyisipan ke dalam tabel yang ada dengan
INSERT INTO <table> SELECT ...berhasil tanpa transmisi manual karena BigQuery otomatis memperluas nilaiINT32danFLOATagar sesuai dengan kolomINT64danFLOAT64tabel target.Meskipun kolom
DECIMALdanNUMERICMySQL dipetakan keBIGNUMERIC(76, 38), MySQL memungkinkan presisi hingga 65. Jika suatu nilai berisi lebih dari 38 digit bilangan bulat (presisi dikurangi skala lebih besar dari 38), nilai tersebut akan melebihi rentang bilangan bulatBIGNUMERICdan kueri akan gagal saat runtime. Untuk mengkueri nilai dengan lebih dari 38 digit bilangan bulat, transmisikan keCHARatauVARCHARdalam pernyataanEXTERNAL_QUERY.Jenis data
TIMEmemotong nilai pecahan sub-detik (mikrodetik) menjadi detik utuh (misalnya,12:34:56.789123menjadi12:34:56). Selain itu,TIMEMySQL mendukung durasi yang berlalu dari-838:59:59hingga838:59:59, sedangkanTIMEBigQuery hanya mendukung nilai waktu dari00:00:00hingga23:59:59.999999. Nilai di luar00:00:00hingga23:59:59akan menyebabkan error kueri runtime. Jika presisi mikrodetik atau nilai durasi yang berlalu diperlukan, transmisikan kolom keCHARatauVARCHARdi dalam pernyataanEXTERNAL_QUERY.Tanggal dan stempel waktu sebelum 15 Oktober 1582 akan mengalami pergeseran kalender selama 10 hari karena transisi kalender Gregorian historis. Untuk mempertahankan tanggal historis yang tepat sebelum tahun 1582, transmisikan tanggal tersebut ke
CHARatauVARCHARdalam pernyataanEXTERNAL_QUERY.
Lingkungan dan versi MySQL yang didukung
Gabungan kueri mendukung database MySQL di seluruh lingkungan deployment berikut:
- Database MySQL yang dihosting di cloud atau lokal yang dapat diakses melalui alamat IP publik atau lampiran jaringan (melalui Cloud VPN atau Cloud Interconnect)
- Instance MySQL yang dihosting sendiri di Compute Engine atau infrastruktur lainnya
- MySQL 8.4 LTS dan 8.0
Sebelum memulai
Pastikan administrator BigQuery Anda telah membuat koneksi MySQL dan membagikannya kepada Anda.
Peran yang diperlukan
Untuk mendapatkan izin yang diperlukan untuk membuat kueri MySQL, minta administrator untuk memberi Anda peran IAM BigQuery Connection User (roles/bigquery.connectionUser) pada project.
Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Mengelola akses ke project, folder, dan organisasi.
Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.
Data kueri
Untuk mengirim kueri gabungan ke MySQL dari kueri GoogleSQL, gunakan fungsi EXTERNAL_QUERY.
Contoh berikut adalah kueri gabungan yang menggabungkan data pelanggan di BigQuery bernama mydataset.customers dengan pesanan penjualan transaksional di MySQL:
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;
Melihat skema tabel MySQL
Anda dapat mengkueri tampilan INFORMATION_SCHEMA MySQL melalui EXTERNAL_QUERY untuk memeriksa metadata database, menemukan tabel, dan meninjau skema kolom sebelum menjalankan analisis.
Mencantumkan semua database
SELECT * FROM EXTERNAL_QUERY( 'projects/PROJECT_ID/locations/LOCATION/connections/CONNECTION_ID', '''SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME FROM INFORMATION_SCHEMA.SCHEMATA''');
Mencantumkan tabel dalam database
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'""");
Melihat kolom dan jenis data dalam tabel
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'""");
Pemetaan jenis data
Saat Anda menjalankan kueri gabungan, BigQuery akan mengonversi data dari MySQL menjadi jenis data GoogleSQL sesuai dengan tabel berikut:
| Jenis data MySQL | Jenis data BigQuery |
|---|---|
| Jenis numerik | |
BOOLEAN, BOOL, TINYINT(1) |
INT64 (kueri interaktif; lihat Batasan untuk CREATE TABLE ... AS SELECT) |
TINYINT, SMALLINT |
INT64 (kueri interaktif; lihat Batasan untuk 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 (kueri interaktif; lihat Batasan untuk CREATE TABLE ... AS SELECT) |
DOUBLE, DOUBLE PRECISION, REAL |
FLOAT64 |
| Jenis tanggal dan waktu | |
DATE |
DATE |
DATETIME |
DATETIME |
TIMESTAMP |
TIMESTAMP |
TIME |
TIME |
| Jenis string dan teks | |
CHAR |
STRING |
VARCHAR |
STRING |
BINARY |
BYTES |
VARBINARY |
BYTES |
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB |
BYTES |
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT |
STRING |
ENUM |
STRING |
SET |
STRING |
Harga
Biaya menjalankan kueri gabungan didasarkan pada tiga faktor:
- Biaya komputasi untuk menjalankan kueri di MySQL (ditagih oleh penyedia database MySQL atau lingkungan hosting Anda)
- Biaya bandwidth untuk mentransfer hasil kueri dari MySQL ke BigQuery (biaya jaringan keluar dari penyedia hosting database Anda)
- Biaya komputasi untuk menjalankan kueri di BigQuery
Setiap biaya komputasi dan egress MySQL ditagih langsung oleh penyedia MySQL atau host infrastruktur Anda, bukan Google. Untuk membatasi
biaya bandwidth, sebaiknya tulis kueri dalam pernyataan EXTERNAL_QUERY
sehingga mengecualikan semua kolom dan baris yang tidak diperlukan untuk menghitung
hasil akhir.
Tidak ada biaya tambahan untuk menjalankan kueri gabungan di BigQuery. Untuk mengetahui informasi selengkapnya tentang harga BigQuery, lihat Harga.
Jika koneksi Anda menggunakan komponen jaringan Google Cloud , harga berikut juga mungkin berlaku:
Langkah berikutnya
- Pelajari cara terhubung ke MySQL.
- Pelajari kueri gabungan lebih lanjut.
- Pelajari cara mengelola koneksi.