PolarDB memungkinkan Anda menggunakan tabel asing Object Storage Service (OSS) untuk menanyakan data berformat CSV yang disimpan di OSS, secara efektif mengurangi biaya penyimpanan. Topik ini menjelaskan cara menggunakan tabel asing OSS untuk mengakses data OSS.
Prasyarat
Kluster PolarDB Anda harus memenuhi salah satu persyaratan berikut:
Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.25.4 atau lebih baru.
Kluster MySQL 8.0.2 dengan versi revisi 8.0.2.2.1 atau lebih baru.
Untuk informasi lebih lanjut tentang cara memeriksa versi kluster, lihat Kueri versi mesin.
Cara kerjanya
Anda dapat menggunakan tabel asing OSS untuk menyimpan data dingin berformat CSV di bucket OSS untuk kueri dan analisis. Data dingin adalah data yang jarang diakses. Gambar berikut menunjukkan prosesnya.
Batasan
Anda hanya dapat menggunakan tabel asing OSS untuk menanyakan data berformat CSV.
Anda hanya dapat melakukan operasi berikut pada tabel asing OSS: CREATE, SELECT, dan DROP.
CatatanOperasi DROP hanya menghapus informasi tabel di PolarDB, tanpa memengaruhi file data yang disimpan di OSS.
Tabel asing OSS tidak mendukung pengindeksan, partisi, atau transaksi.
Data berformat CSV dapat berisi nilai numerik, tanggal dan waktu, string, serta nilai NULL. Tabel-tabel berikut menggambarkan tipe data yang didukung.
CatatanTipe data geospasial tidak didukung.
Anda tidak dapat menanyakan file terkompresi dalam format CSV.
Nilai NULL didukung untuk kluster yang memenuhi salah satu persyaratan berikut:
Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.28 atau lebih baru.
Kluster MySQL 8.0.2 dengan versi revisi 8.0.2.2.5 atau lebih baru.
Tipe numerik
Tipe data
Ukuran
Rentang data (bertanda)
Rentang data (tidak bertanda)
Deskripsi
TINYINT
1 Byte
-128~127
0~255
Nilai integer kecil
SMALLINT
2 Bytes
-32768 hingga 32767
0~65535
Nilai integer
MEDIUMINT
3 Bytes
-8388608 hingga 8388607
0 hingga 16.777.215
Nilai integer
INT atau INTEGER
4 Bytes
-2147483648 hingga 2147483647
0~4294967295
Nilai integer
BIGINT
8 Bytes
-9.223.372.036.854.775.808~9.223.372.036.854.775.807
0~18446744073709551615
Nilai integer besar
FLOAT
4 Bytes
-3.402823466 E+38~-1.175494351E-38; 0; 1.175494351E-38~3.402823466351E+38
0; 1.175494351E-38~3.402823466E+38
Nilai floating-point presisi tunggal
DOUBLE
8 Bytes
-2.2250738585072014E-308~-1.7976931348623157E+308; 0; 1.7976931348623157E+308~2.2250738585072014E-308
0; 1.7976931348623157E+308~2.2250738585072014E-308
Nilai floating-point presisi ganda
DECIMAL
Untuk DECIMAL(M,D), ukurannya adalah M+2 jika M>D. Jika tidak, ukurannya adalah D+2.
Tergantung pada nilai M dan D.
Tergantung pada nilai M dan D.
Nilai desimal
Tipe data tanggal dan waktu
Tipe data
Ukuran
Rentang data
Format
Deskripsi
DATE
3 Bytes
1000-01-01~9999-12-31
YYYY-MM-DD
Nilai tanggal
TIME
3 Bytes
-838:59:59~838:59:59
HH:MM:SS
Nilai waktu atau durasi
YEAR
1 Byte
1901~2155
YYYY
Nilai tahun
DATETIME
8 Bytes
1000-01-01 00:00:00~9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
Nilai gabungan tanggal dan waktu
CatatanBulan dan tanggal dari tipe ini harus memiliki dua digit. Misalnya, 1 Januari 2020 harus ditulis sebagai 2020-01-01, bukan 2020-1-1. Kueri tidak dapat dieksekusi sesuai harapan jika 2020-1-1 didorong ke OSS.
TIMESTAMP
4 Bytes
1970-01-01 00:00:00~2038-01-19 03:14:07
YYYY-MM-DD HH:MM:SS
Nilai timestamp (gabungan tanggal dan waktu)
CatatanBulan dan tanggal dari tipe ini harus memiliki dua digit. Misalnya, 1 Januari 2020 harus ditulis sebagai 2020-01-01, bukan 2020-1-1. Kueri tidak dapat dieksekusi sesuai harapan jika 2020-1-1 didorong ke OSS.
Tipe string
Tipe data
Ukuran
Deskripsi
CHAR
0~255 Bytes
String dengan panjang tetap
VARCHAR
0~65.535 Bytes
String dengan panjang variabel
TINYBLOB
0~255 Bytes
Objek besar biner kecil hingga 255 karakter
TINYTEXT
0~255 Bytes
String pendek
BLOB
0 hingga 65535 Byte
Objek besar biner standar
TEXT
0-65535 Byte
String standar
MEDIUMBLOB
0~16.777.215 Bytes
Objek besar biner sedang
MEDIUMTEXT
0~16.777.215 Bytes
String sedang
LONGBLOB
0~4.294.967.295 Bytes
Objek besar biner panjang
LONGTEXT
0~4.294.967.295 Bytes
String panjang
Nilai NULL
Sisipkan nilai NULL
Sisipkan nilai NULL ke dalam tabel asing OSS.
Untuk menyisipkan nilai NULL ke dalam tabel asing OSS, Anda harus menetapkan
NULL_MARKERsaat membuat tabel. Nilai default dariNULL_MARKERadalah NULL untuk tabel asing OSS. Anda dapat mengeksekusi pernyataanSHOW CREATE TABLEuntuk memeriksa nilai NULL_MARKER.SHOW CREATE TABLE t1;Hasil sampel:
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | t1 | CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL ) ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='server_name' | +-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)Sisipkan nilai NULL ke dalam file CSV.
Jika Anda menyisipkan nilai
NULL_MARKERuntuk bidang dalam file CSV tanpa mengapit nilai tersebut dalam tanda kutip ganda ("), PolarDB mengidentifikasi nilai tersebut sebagai NULL.CatatanJika Anda mengapit nilai
NULL_MARKERdalam tanda kutip ganda ("), PolarDB mengidentifikasi nilai tersebut sebagai string. Ini berarti bahwa pernyataanis_nulltidak dapat mengidentifikasi nilai tersebut sebagai NULL. Jika tipe data bidang tempat nilai NULL ditetapkan dalam file CSV tidak sesuai dengan bidang yang sesuai dalam tabel asing OSS, kesalahan akan dilaporkan.Nilai
NULL_MARKERtidak boleh hanya berisi angka atau dibiarkan kosong. Selain itu, tidak boleh mengandung empat karakter berikut:",\n,\r, atau,
Contoh
Eksekusi pernyataan berikut untuk membuat tabel asing OSS:
CREATE TABLE `t1` ( `id` int(11) DEFAULT NULL, `name` varchar(20) DEFAULT NULL, `time` timestamp NULL DEFAULT NULL ) ENGINE=CSV NULL_MARKER='NULL' CONNECTION='server_name';Dalam contoh ini, file data berisi data berikut:
1,"xiaohong","2022-01-01 00:00:00" NULL,"xiaoming","2022-02-01 00:00:00" 3,NULL,"2022-03-01 00:00:00" 4,"xiaowang",NULLData OSS berikut diperoleh jika Anda menanyakan tabel asing OSS:
SELECT * FROM t1; +------+----------+---------------------+ | id | name | time | +------+----------+---------------------+ | 1 | xiaohong | 2022-01-01 00:00:00 | | NULL | xiaoming | 2022-02-01 00:00:00 | | 3 | NULL | 2022-03-01 00:00:00 | | 4 | xiaowang | NULL | +------+----------+---------------------+
Baca nilai NULL
Saat data dibaca dari file CSV, jika nilai bidang dalam file CSV adalah NULL dan nilai yang sesuai dalam tabel asing OSS dapat diatur ke NULL, bidang tersebut langsung diatur ke NULL.
Saat data dibaca dari file CSV, jika nilai bidang dalam file CSV adalah NULL tetapi nilai yang sesuai dalam tabel asing OSS diatur ke NOT NULL, data dalam file CSV bertentangan dengan data yang ditentukan dalam tabel asing OSS. Dalam hal ini, hasil yang berbeda akan dikembalikan tergantung pada aturan verifikasi sintaksis yang ditentukan.
Jika Anda menetapkan
sql_modekeSTRICT_TRANS_TABLES, kesalahan akan dilaporkan.Jika Anda menetapkan
sql_modeke nilai selainSTRICT_TRANS_TABLESdan bidang saat ini memiliki nilai default, nilai bidang saat ini diatur ke nilai default. Jika bidang saat ini tidak memiliki nilai default, bidang tersebut diberi nilai default MySQL berdasarkan tipe bidang. Untuk informasi lebih lanjut, lihat Nilai Default Tipe Data. Jika pesan peringatan muncul, Anda dapat mengeksekusi pernyataanSHOW WARNINGS;untuk melihat detail pesan peringatan.
CatatanAnda dapat mengeksekusi pernyataan
SHOW VARIABLES LIKE "sql_mode";untuk melihat aturan verifikasi sintaksis saat ini. Anda dapat masuk ke Konsol PolarDB dan pergi ke untuk memodifikasi nilaisql_modeguna mengubah aturan verifikasi sintaksis. Untuk informasi lebih lanjut, lihat Modifikasi parameter.Contoh
Buat tabel asing OSS bernama
t, lalu tetapkan bidangidke NOT NULL dan tanpa nilai default.CREATE TABLE `t` ( `id` int(11) NOT NULL ) ENGINE=CSV CONNECTION="server_name";Dalam contoh ini, file
t.csvberisi data berikut:NULL 2Saat Anda menggunakan tabel asing OSS untuk membaca data dari file CSV, salah satu skenario berikut terjadi:
Jika
sql_modediatur keSTRICT_TRANS_TABLESdan ketika Anda mengeksekusi pernyataan berikut untuk menanyakan data dalam file CSV:SELECT * FROM t;Pesan kesalahan berikut dilaporkan:
ERROR 1364 (HY000): Field 'id' doesn't have a default valueJika
sql_modediatur ke nilai selainSTRICT_TRANS_TABLESdan ketika Anda mengeksekusi pernyataan berikut untuk menanyakan data dalam file CSV:SELECT * FROM t;Hasil sampel:
+----+ | id | +----+ | 0 | | 2 | +----+ 2 rows in set, 1 warning (0.00 sec)0 adalah nilai default MySQL. Eksekusi pernyataan berikut untuk melihat detail pesan peringatan:
SHOW WARNINGS;Hasil sampel:
+---------+------+-----------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------+ | Warning | 1364 | Field 'id' doesn't have a default value | +---------+------+-----------------------------------------+ 1 row in set (0.00 sec)
Parameter
Masuk ke Konsol PolarDB. Temukan kluster di halaman Kluster dan buka halaman untuk memodifikasi parameter.
Parameter | Tingkat | Deskripsi |
loose_csv_oss_buff_size | Sesi | Ukuran memori yang digunakan oleh thread OSS. Nilai default: 134217728. Unit: byte. Nilai valid: 4096 hingga 134217728. |
loose_csv_max_oss_threads | Global | Jumlah thread OSS yang diizinkan untuk berjalan. Nilai default: 1. Nilai valid: 1 hingga 100. |
Memori maksimum untuk OSS adalah loose_csv_max_oss_threads * loose_csv_oss_buff_size.
Saat menggunakan OSS, kami sarankan Anda membatasi penggunaan memori total OSS hingga 5% dari kapasitas memori node saat ini. Jika tidak, masalah kehabisan memori mungkin terjadi.
Prosedur
Buat server OSS
Buat server OSS untuk menambahkan informasi koneksi OSS dan terhubung ke OSS.
Metode lain untuk terhubung ke OSS telah dinonaktifkan karena risiko keamanan. Anda hanya dapat membuat server OSS untuk menambahkan informasi koneksi OSS dan terhubung ke OSS.
Pernyataan untuk kluster versi lebih baru
Jika kluster Anda memenuhi persyaratan berikut, sintaksis pembuatan dalam bagian ini berlaku:
Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.28 atau lebih baru.
Kluster MySQL 8.0.2 dengan versi revisi 8.0.2.2.5 atau lebih baru.
CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
[DATABASE '<my_database_name>',]
EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id": "<my_oss_access_key_id>","oss_access_key_secret": "<my_oss_access_key_secret>","oss_prefix":"<my_oss_prefix>","oss_sts_token":"<my_oss_sts_token>"}'
);Parameter
DATABASEbersifat opsional. Parameter ini bekerja sama dengan parameteross_prefix. Kami sarankan Anda menggunakanoss_prefix.Parameter
oss_sts_tokendidukung untuk kluster yang memenuhi persyaratan berikut:Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.29 atau lebih baru.
Kluster MySQL 8.0.2 dengan versi revisi 8.0.2.2.6 atau lebih baru.
Tabel berikut menjelaskan parameter dalam sintaksis.
Parameter | Tipe data | Diperlukan | Deskripsi |
server_name | STRING | Ya | Nama server OSS. Catatan Nama harus unik secara global. Nama dapat memiliki panjang hingga 64 karakter dan tidak peka huruf besar-kecil. Nama yang mengandung lebih dari 64 karakter akan dipotong secara otomatis. Anda dapat menentukan nama server OSS sebagai string yang dikutip. |
my_database_name | String | Tidak | Direktori OSS untuk file CSV. Catatan Jika baik parameter |
my_oss_endpoint | STRING | Ya | Endpoint server OSS. Catatan Jika Anda mengakses database Anda dari server Alibaba Cloud, gunakan endpoint internal untuk mencegah terjadinya lalu lintas Internet. Endpoint internal mengandung kata kunci "internal". Sebagai contoh, endpoint internal node OSS di wilayah China (Hangzhou) adalah |
my_oss_bucket | STRING | Ya | Bucket tempat file data disimpan. Sebelum mengimpor data, Anda harus membuat bucket OSS. Catatan Kami sarankan Anda menerapkan bucket di zona yang sama dengan kluster PolarDB untuk mengurangi latensi jaringan. |
my_oss_access_key_id | STRING | Ya | ID AccessKey pengguna RAM atau akun Alibaba Cloud. |
my_oss_access_key_secret | STRING | Ya | Rahasia AccessKey pengguna RAM atau akun Alibaba Cloud. |
my_oss_prefix | String | Tidak | Direktori OSS untuk file CSV. |
my_oss_sts_token | String | Tidak | Kredensial akses sementara yang disediakan oleh Security Token Service (STS) Catatan
|
Pernyataan untuk kluster versi lebih lama
Jika kluster Anda memenuhi persyaratan berikut, sintaksis pembuatan dalam bagian ini berlaku:
Kluster MySQL 8.0.1 dengan versi revisi dari 8.0.1.1.25.4 hingga 8.0.1.1.28.
Kluster MySQL 8.0.2 dengan versi revisi dari 8.0.2.2.1 hingga 8.0.2.2.5.
CREATE SERVER <server_name>
FOREIGN DATA WRAPPER oss OPTIONS
(
[DATABASE '<my_database_name>',]
EXTRA_SERVER_INFO '{"oss_endpoint": "<my_oss_endpoint>","oss_bucket": "<my_oss_bucket>","oss_access_key_id":"<my_oss_access_key_id>","oss_access_key_secret":"<my_oss_access_key_secret>"}'
); Parameter oss_prefix dan oss_sts_token tidak didukung.
Tabel berikut menjelaskan parameter dalam sintaksis.
Parameter | Tipe data | Diperlukan | Komponen |
server_name | STRING | Ya | Nama server OSS. Catatan Nama harus unik secara global. Nama dapat memiliki panjang hingga 64 karakter dan tidak peka huruf besar-kecil. Nama yang mengandung lebih dari 64 karakter akan dipotong secara otomatis. Anda dapat menentukan nama server OSS sebagai string yang dikutip. |
my_database_name | String | Tidak | Nama direktori OSS untuk file CSV. |
my_oss_endpoint | STRING | Ya | Endpoint server OSS. Catatan Jika Anda mengakses database Anda dari server Alibaba Cloud, gunakan endpoint internal untuk mencegah terjadinya lalu lintas Internet. Endpoint internal mengandung kata kunci "internal". Contoh: |
my_oss_bucket | STRING | Ya | Bucket tempat file data disimpan. Sebelum mengimpor data, Anda harus membuat bucket OSS. |
my_oss_access_key_id | STRING | Ya | ID AccessKey pengguna RAM atau akun Alibaba Cloud. |
my_oss_access_key_secret | STRING | Ya | Rahasia AccessKey pengguna RAM atau akun Alibaba Cloud. |
Izin SERVERS_ADMIN diperlukan saat Anda membuat server OSS. Anda dapat mengeksekusi pernyataan SHOW GRANTS FOR username; untuk memeriksa apakah pengguna saat ini memiliki izin SERVERS_ADMIN. Akun istimewa memiliki izin SERVERS_ADMIN secara default, dan dapat memberikan izin SERVERS_ADMIN kepada akun standar.
Jika Anda tidak memiliki izin
SERVERS_ADMIN, pesan kesalahanAccess denied; you need (at least one of) the SERVERS_ADMIN OR SUPER privilege(s) for this operationmuncul.Jika Anda menggunakan akun standar yang tidak memiliki izin
SERVERS_ADMIN, Anda dapat menggunakan akun istimewa untuk mengeksekusi pernyataan berikut:GRANT SERVERS_ADMIN ON *.* TO `users`@`%` WITH GRANT OPTION.Jika Anda menggunakan akun istimewa yang tidak memiliki izin
SERVERS_ADMIN, Anda dapat menyetel ulang izin akun tersebut. Untuk melakukannya, temukan kluster di Konsol PolarDB dan klik ID atau nama kluster untuk masuk ke halaman detail kluster. Di panel navigasi sebelah kiri, pilih . Pada tab Akun Pengguna, temukan akun istimewa yang ingin dikelola dan klik **Setel Ulang Izin** di kolom Tindakan. Tunggu hingga izin selesai disetel ulang. Setelah proses ini selesai, akun istimewa akan memiliki izinSERVERS_ADMIN.Jika Anda menggunakan akun istimewa, Anda dapat mengeksekusi pernyataan
SELECT Server_name, Extra_server_info FROM mysql.servers;untuk melihat informasi server OSS yang Anda buat. Nilai parameteross_access_key_iddanoss_access_key_secretdienkripsi demi alasan keamanan.
Unggah data
Anda dapat menggunakan alat ossutil untuk mengunggah file CSV lokal ke bucket OSS jarak jauh.
Direktori OSS untuk file CSV harus berupa direktori
DATABASEatauoss_prefixpada server OSS.Nama file CSV harus berupa
Nama tabel asing OSS.CSVdan ekstensi CSV harus dalam huruf besar. Sebagai contoh, jika nama tabel asing OSS adalaht1, nama file CSV harust1.CSV.Bidang data dalam file CSV harus sesuai dengan bidang tabel asing OSS. Sebagai contoh, jika tabel asing OSS
t1hanya memiliki bidangidbertipeINT, file CSV hanya dapat memiliki satu bidang bertipeINT.Kami sarankan Anda langsung mengunggah file data MySQL lokal dan membuat tabel asing OSS berdasarkan definisi tabel.
Buat tabel asing OSS
Setelah Anda mendefinisikan server OSS, Anda dapat membuat tabel asing OSS di PolarDB untuk terhubung ke OSS. Contoh:
CREATE TABLE <table_name> (create_definition,...) engine=csv connection="<connection_string>";Nilai dari connection_string terdiri dari item-item berikut yang dipisahkan oleh garis miring (/):
Nama server OSS.
Opsional. Jalur file data di OSS.
CatatanAnda dapat mengonfigurasi jalur file data di OSS jika kluster Anda memenuhi persyaratan berikut:
Kluster MySQL 8.0.1 dengan versi revisi 8.0.1.1.28 atau lebih baru.
Kluster MySQL 8.0.2 dengan versi revisi 8.0.2.2.5 atau lebih baru.
(Opsional) Nama file data.
CatatanNama file data tidak boleh mengandung ekstensi
.CSV.Jika Anda tidak menentukan nama file data, file OSS yang sesuai dengan tabel saat ini adalah
Nama tabel saat ini.CSV. Jika Anda menentukan nama file data, file OSS yang sesuai dengan tabel saat ini adalahNama file data yang ditentukan.CSV.Jika Anda mengonfigurasi jalur file data di OSS, Anda harus menentukan nama file. Jika tidak, segmen terakhir dari jalur akan dianggap sebagai nama file saat sistem mencari file data.
Lihat tabel asing OSS
Setelah tabel asing OSS dibuat, Anda dapat mengeksekusi pernyataan show create table untuk melihat tabel asing OSS. Periksa apakah mesin tabel yang dibuat adalah CSV (ENGINE=CSV). Jika tidak, versi kluster PolarDB Anda sudah usang dan tidak mendukung OSS. Untuk informasi lebih lanjut, lihat Prasyarat.
Contoh
CREATE TABLE t1 (id int) engine=csv connection="server_name/a/b/c/d/t1";Dalam kode sampel sebelumnya, connection_string terdiri dari elemen-elemen berikut:
Nama server OSS:
server_name.Jalur file data di OSS:
oss_prefix/a/b/c/d/.File data:
t1. File data aktual adalaht1.CSV. Akhiran.CSVdihilangkan berdasarkan persyaratan parameter.
Anda hanya dapat menggunakan nama file data untuk menentukan file data yang sesuai dengan tabel asing OSS. Sebagai contoh, pernyataan berikut menanyakan file t2.CSV di jalur oss_prefix OSS.
CREATE TABLE t1 (id int) engine=csv connection="server_name/t2";Kueri data
Tabel t1 digunakan dalam contoh berikut.
# Kueri jumlah catatan data di tabel t1.
SELECT count(*) FROM t1;
# Kueri catatan dalam rentang tertentu.
SELECT id FROM t1 WHERE id < 10 AND id > 1;
# Kueri catatan tertentu.
SELECT id FROM t1 where id = 3;
# Kueri catatan dengan menggabungkan beberapa tabel.
SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";Tabel berikut menjelaskan pesan kesalahan umum dan penyebabnya saat Anda menanyakan data.
Jika tidak ada pesan kesalahan yang dilaporkan tetapi muncul pesan peringatan saat Anda menanyakan data, Anda harus mengeksekusi pernyataan SHOW WARNINGS; untuk melihat pesan tersebut.
Pesan kesalahan | Penyebab | Solusi |
Kesalahan OSS: Tidak ada file data yang sesuai di mesin OSS. | File data yang ditentukan tidak ditemukan di OSS. | Periksa apakah file data ada di jalur yang ditentukan di OSS berdasarkan aturan sebelumnya.
|
Tidak cukup ruang memori untuk transmisi OSS. Memori yang diminta saat ini %d. | Memori tidak cukup untuk kueri OSS. | Anda dapat menggunakan salah satu metode berikut untuk memperbaiki kesalahan ini:
|
ERROR 8054 (HY000): Kesalahan OSS: pesan kesalahan : Tidak dapat terhubung ke server. Gagal terhubung ke aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80; | Kluster saat ini tidak dapat terhubung ke server OSS. | Periksa apakah kluster saat ini berada di zona yang sama dengan bucket OSS.
|
Optimasi kueri
Selama proses kueri, mesin kueri dapat mendorong kueri dengan kondisi tertentu ke bucket OSS jarak jauh untuk meningkatkan efisiensi kueri. Optimasi ini disebut engine condition pushdown. Fitur penurunan kondisi mesin tunduk pada batasan berikut:
Hanya file CSV yang dikodekan UTF-8 yang didukung.
Hanya jenis operator berikut yang didukung dalam pernyataan SQL:
Operator perbandingan:
>,<,>=,<=, dan==Operator logika:
LIKE,IN,AND, danOROperator aritmatika:
+,-,*, dan/
Hanya satu file yang dapat ditanyakan saat Anda menggunakan pernyataan SQL. Klausul berikut tidak didukung: JOIN, ORDER BY, GROUP BY, dan HAVING.
Klausa WHERE tidak boleh mengandung kondisi agregasi. Sebagai contoh,
WHERE max(age) > 100tidak diizinkan.Maksimal 1.000 kolom dapat ditentukan untuk pernyataan SQL. Nama kolom dalam pernyataan SQL dapat memiliki panjang maksimal 1.024 byte.
Maksimal lima karakter wildcard (
%) didukung dalam klausa LIKE.Maksimal 1.024 konstanta didukung dalam klausa IN.
Ukuran kolom maksimum dan ukuran baris untuk objek CSV adalah 256 KB.
Ukuran maksimum pernyataan SQL adalah 16 KB. Maksimal 20 ekspresi dapat ditambahkan setelah klausa WHERE. Setiap pernyataan mendukung hingga 100 operasi agregasi.
Secara default, fitur penurunan kondisi mesin dinonaktifkan. Untuk mengaktifkan fitur ini, eksekusi pernyataan SET SESSION optimizer_switch='engine_condition_pushdown=on';.
Kueri yang memenuhi kondisi di atas didorong ke bucket OSS jarak jauh. Anda dapat menggunakan rencana eksekusi tabel asing OSS untuk melihat kueri yang didorong ke bucket OSS jarak jauh.
Lihat rencana eksekusi tabel asing OSS dengan mengeksekusi pernyataan
EXPLAIN. Contoh:EXPLAIN SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC; +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 15000 | 1.23 | Menggunakan where; Dengan kondisi mesin yang didorong ((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100)); Menggunakan sementara; Menggunakan pengurutan file | +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)Kueri dengan kondisi setelah
Dengan kondisi mesin yang didorongdapat didorong ke bucket OSS jarak jauh. Kueri dengan kondisi`name` LIKE "%1%%%%%"danGROUP BY `id` ORDER BY `id` DESChanya dapat dilakukan di server OSS lokal.Lihat rencana eksekusi tabel asing OSS dalam format
tree. Contoh:EXPLAIN FORMAT=tree SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" Y `id` ORDER BY `id` DESC; +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | EXPLAIN | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | -> Sort: <temporary>.id DESC -> Table scan on <temporary> -> Aggregate using temporary table -> Filter: (t1.`name` like '%1%%%%%') (cost=1690.00 rows=185) -> Table scan on t1, extra ( engine conditions: ((t1.id > 5) and (t1.id < 100)) ) (cost=1690.00 rows=15000) | +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)Kueri dengan kondisi setelah
kondisi mesin:dapat didorong ke bucket OSS jarak jauh. Kueri dengan kondisi`name` LIKE "%1%%%%%"danGROUP BY `id` ORDER BY `id` DESChanya dapat dilakukan di server OSS lokal.CatatanAnda harus menggunakan kluster PolarDB for MySQL 8.0.2 untuk menanyakan data. Anda dapat memeriksa nomor versi untuk memeriksa versi kluster.
Lihat rencana eksekusi tabel asing OSS dalam format
JSON. Contoh:EXPLAIN FORMAT=json SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `id` ORDER BY `id` DESC; +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | EXPLAIN | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | { "query_block": { "select_id": 1, "cost_info": { "query_cost": "1875.13" }, "ordering_operation": { "using_filesort": false, "grouping_operation": { "using_temporary_table": true, "using_filesort": true, "cost_info": { "sort_cost": "185.13" }, "table": { "table_name": "t1", "access_type": "ALL", "rows_examined_per_scan": 15000, "rows_produced_per_join": 185, "filtered": "1.23", "engine_condition": "((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100))", "cost_info": { "read_cost": "1671.49", "eval_cost": "18.51", "prefix_cost": "1690.00", "data_read_per_join": "146K" }, "used_columns": [ "id", "name" ], "attached_condition": "(`test`.`t1`.`name` like '%1%%%%%')" } } } } } | +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)Kueri dengan kondisi setelah
kondisi mesin:dapat didorong ke bucket OSS jarak jauh. Kueri dengan kondisi`name` LIKE "%1%%%%%"danGROUP BY `id` ORDER BY `id` DESChanya dapat dilakukan di server OSS lokal.
Jika kesalahan berikut terjadi, beberapa karakter dalam file data OSS saat ini tidak memenuhi persyaratan untuk penurunan kondisi mesin.
Kesalahan OSS: Kueri saat ini tidak mendukung penurunan kondisi mesin. Anda perlu menggunakan petunjuk NO_ECP() atau menyetel optimizer_switch = 'engine_condition_pushdown=OFF' untuk mematikan fungsi penurunan kondisi.Anda dapat menggunakan petunjuk atau variabel optimizer_switch untuk menonaktifkan fitur penurunan kondisi mesin secara manual.
hints
Gunakan petunjuk untuk menonaktifkan fitur penurunan kondisi mesin untuk kueri. Dalam contoh berikut, fitur penurunan kondisi mesin dinonaktifkan untuk tabel
t1:SELECT /*+ NO_ECP(t1) */ `j` FROM `t1` WHERE `j` LIKE "%c%" LIMIT 10;optimizer_switch
Gunakan variabel optimizer_switch untuk menonaktifkan fitur penurunan kondisi mesin untuk semua kueri dalam sesi saat ini.
SET SESSION optimizer_switch='engine_condition_pushdown=off'; # Setel parameter engine_condition_pushdown ke off. Dalam hal ini, fitur penurunan kondisi mesin dinonaktifkan untuk semua kueri dalam sesi saat ini.Anda dapat mengeksekusi pernyataan berikut untuk menentukan apakah fitur penurunan kondisi mesin diaktifkan untuk semua kueri dalam sesi saat ini berdasarkan nilai variabel optimizer_switch:
select @@optimizer_switch;
Sinkronkan informasi server OSS antar beberapa node
Node utama dan node baca-saja dari kluster PolarDB berbagi server OSS yang sama. Ini memastikan bahwa node-node tersebut dapat mengakses data OSS. Sinkronisasi informasi server OSS antar node ini bebas kunci untuk memastikan bahwa operasi pada node-node tersebut independen.
Setelah Anda memodifikasi informasi server OSS, modifikasi tersebut disinkronkan ke node baca-saja secara bebas kunci. Jika sebuah thread di node baca-saja memegang kunci untuk server OSS, sinkronisasi informasi server OSS mungkin tertunda. Dalam hal ini, Anda dapat mengeksekusi pernyataan /*force_node='pi-bpxxxxxxxx'*/ flush privileges; atau /*force_node='pi-bpxxxxxxxx'*/flush table oss_foreign_table; untuk memperbarui informasi server OSS dari node baca-saja secara manual.