PolarDB dapat langsung mengkueri data berformat CSV di OSS menggunakan tabel eksternal, sehingga mengurangi biaya penyimpanan Anda. Topik ini menjelaskan cara mengakses data di OSS menggunakan tabel eksternal.
Prasyarat
Kluster PolarDB Anda harus memenuhi salah satu persyaratan berikut:
Versi engine adalah MySQL 8.0.1 dengan revisi 8.0.1.1.25.4 atau lebih baru.
Versi engine adalah MySQL 8.0.2 dengan revisi 8.0.2.2.1 atau lebih baru.
Untuk memeriksa versi engine, lihat Memeriksa versi engine.
Cara kerja
Tabel eksternal OSS memungkinkan Anda menyimpan data berformat CSV yang jarang dikueri (dikenal sebagai cold data) di OSS serta mengkueri dan menganalisisnya.
Batasan
Tabel eksternal OSS hanya dapat mengkueri data dari file CSV.
Tabel eksternal OSS hanya mendukung pernyataan CREATE, SELECT, dan DROP.
CatatanOperasi DROP hanya menghapus metadata tabel di PolarDB, bukan file data di OSS.
Tabel eksternal OSS tidak mendukung indeks, partisi, atau transaksi.
Tipe data yang didukung untuk data dalam format CSV mencakup tipe numerik, tipe tanggal dan waktu, tipe string, dan nilai NULL.
CatatanTipe data geospasial tidak didukung.
Anda tidak dapat mengkueri file CSV terkompresi.
Nilai NULL hanya didukung jika salah satu kondisi berikut terpenuhi:
Versi kernel adalah MySQL 8.0.1 dan revisinya 8.0.1.1.28 atau lebih baru.
Versi kernel adalah MySQL 8.0.2 dan revisinya 8.0.2.2.5 atau lebih baru.
Tipe numerik
Type
Size
Signed range
Unsigned range
Description
TINYINT
1 byte
-128 hingga 127
0 hingga 255
Bilangan bulat sangat kecil.
SMALLINT
2 bytes
-32768 hingga 32767
0 hingga 65535
Bilangan bulat kecil.
MEDIUMINT
3 bytes
-8388608 hingga 8388607
0 hingga 16777215
Bilangan bulat berukuran sedang.
INT or INTEGER
4 bytes
-2147483648 hingga 2147483647
0 hingga 4294967295
Bilangan bulat standar.
BIGINT
8 bytes
-9.223.372.036.854.775.808 hingga 9.223.372.036.854.775.807
0 hingga 18.446.744.073.709.551.615
Bilangan bulat besar.
FLOAT
4 bytes
-3,402823466E+38 hingga -1,175494351E-38; 0; 1,175494351E-38 hingga 3,402823466E+38
0; 1,175494351E-38 hingga 3,402823466E+38
Bilangan titik mengambang presisi tunggal.
DOUBLE
8 bytes
-1,7976931348623157E+308 hingga -2,2250738585072014E-308; 0; 2,2250738585072014E-308 hingga 1,7976931348623157E+308
0; 2,2250738585072014E-308 hingga 1,7976931348623157E+308
Bilangan titik mengambang presisi ganda.
DECIMAL
Untuk DECIMAL(M,D), ukurannya adalah M+2 byte jika M > D, atau D+2 byte sebaliknya.
Tergantung pada nilai M dan D.
Tergantung pada nilai M dan D.
Bilangan desimal.
Tipe tanggal dan waktu
Type
Size
Range
Format
Description
DATE
3 bytes
1000-01-01 hingga 9999-12-31
YYYY-MM-DD
Nilai tanggal.
TIME
3 bytes
-838:59:59 hingga 838:59:59
HH:MM:SS
Nilai waktu atau durasi.
YEAR
1 byte
1901 hingga 2155
YYYY
Nilai tahun.
DATETIME
8 bytes
1000-01-01 00:00:00 hingga 9999-12-31 23:59:59
YYYY-MM-DD HH:MM:SS
Nilai gabungan tanggal dan waktu.
CatatanUntuk tipe data ini, bulan dan hari harus berupa angka dua digit. Misalnya, gunakan
2020-01-01alih-alih2020-1-1. Jika tidak, kueri akan gagal saat diteruskan ke OSS.TIMESTAMP
4 bytes
1970-01-01 00:00:00 hingga 2038-01-19 03:14:07
YYYY-MM-DD HH:MM:SS
Timestamp, yaitu nilai gabungan tanggal dan waktu.
CatatanUntuk tipe data ini, bulan dan hari harus berupa angka dua digit. Misalnya, gunakan
2020-01-01alih-alih2020-1-1. Jika tidak, kueri akan gagal saat diteruskan ke OSS.Tipe string
Type
Size
Description
CHAR
0 hingga 255 bytes
String dengan panjang tetap.
VARCHAR
0 hingga 65.535 bytes
String dengan panjang variabel.
TINYBLOB
0 hingga 255 bytes
String biner dengan panjang maksimum 255 karakter.
TINYTEXT
0 hingga 255 bytes
String teks pendek.
BLOB
0 hingga 65.535 bytes
Data teks panjang dalam format biner.
TEXT
0 hingga 65.535 bytes
Data teks panjang.
MEDIUMBLOB
0 hingga 16.777.215 bytes
Data teks berukuran sedang dalam format biner.
MEDIUMTEXT
0 hingga 16.777.215 bytes
Data teks berukuran sedang.
LONGBLOB
0 hingga 4.294.967.295 bytes
Data teks sangat besar dalam format biner.
LONGTEXT
0 hingga 4.294.967.295 bytes
Data teks sangat besar.
Nilai NULL
Penyisipan
Sisipkan nilai NULL ke dalam tabel eksternal OSS.
Untuk menyisipkan nilai NULL ke dalam tabel eksternal OSS, tentukan penanda nilai NULL yang sesuai,
NULL_MARKER, saat membuat tabel. Nilai defaultNULL_MARKERuntuk tabel eksternal OSS adalah NULL. Anda dapat menjalankan pernyataanSHOW CREATE TABLEuntuk melihat penanda nilai NULL:SHOW CREATE TABLE t1;Hasil berikut dikembalikan:
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 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
NULL_MARKERke dalam bidang file CSV, danNULL_MARKERtidak diapit tanda kutip ganda, PolarDB akan mengenali nilai tersebut sebagai NULL.CatatanJika Anda menambahkan tanda kutip ganda di sekitar
NULL_MARKER, PolarDB mengenalinya sebagai string. Akibatnya, Anda tidak dapat menggunakan pernyataanis_nulluntuk menemukan nilai NULL, dan kesalahan dilaporkan jika parameter yang diberi nilai NULL dalam file CSV tidak sesuai dengan tipe data parameter yang sesuai di tabel eksternal OSS.NULL_MARKERtidak boleh berupa nilai numerik, string kosong, atau mengandung karakter berikut:",\n,\r, dan,
Contoh
Gunakan pernyataan berikut untuk membuat tabel eksternal 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';Asumsikan bahwa file data berisi konten 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",NULLMengkueri tabel eksternal OSS mengembalikan data berikut:
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 | +------+----------+---------------------+
Membaca
Saat data dibaca dari file CSV, jika nilai dalam file CSV adalah NULL dan kolom yang sesuai di tabel eksternal OSS dapat bernilai NULL, kolom tersebut diatur ke NULL.
Jika nilai NULL dibaca dari file CSV untuk kolom yang didefinisikan sebagai NOT NULL, terjadi konflik. Hasilnya bergantung pada mode SQL.
Jika
sql_modediatur keSTRICT_TRANS_TABLES, kesalahan dilaporkan.Jika
sql_modediatur ke mode selainSTRICT_TRANS_TABLES, kolom tersebut diatur ke nilai default yang telah ditentukan. Jika tidak ada nilai default yang ditentukan, kolom tersebut diatur ke nilai default MySQL untuk tipe datanya. Untuk informasi lebih lanjut, lihat Data Type Default Values. Peringatan juga dikembalikan. Gunakan perintahSHOW WARNINGS;untuk melihat detail peringatan.
CatatanGunakan perintah
SHOW VARIABLES LIKE "sql_mode";untuk melihat mode SQL saat ini. Anda juga dapat membuka Konsol PolarDB dan mengubah parametersql_modepada halaman . Untuk informasi lebih lanjut, lihat Mengubah parameter.Contoh
Buat tabel eksternal OSS bernama
tdi mana kolomiddiatur sebagai NOT NULL dan tidak memiliki nilai default.CREATE TABLE `t` ( `id` int(11) NOT NULL ) ENGINE=CSV CONNECTION="server_name";Asumsikan bahwa file CSV
t.CSVberisi konten berikut:NULL 2Dua skenario berikut dapat terjadi saat Anda membaca data dari file CSV menggunakan tabel eksternal OSS:
Jika
sql_modediatur keSTRICT_TRANS_TABLES, jalankan perintah berikut untuk mengkueri data dari file CSV:SELECT * FROM t;Pesan kesalahan berikut dilaporkan:
ERROR 1364 (HY000): Field 'id' doesn't have a default valueJika
sql_modediatur ke mode selainSTRICT_TRANS_TABLES, jalankan perintah berikut untuk mengkueri data dari file CSV:SELECT * FROM t;Hasil berikut dikembalikan:
+----+ | id | +----+ | 0 | | 2 | +----+ 2 rows in set, 1 warning (0.00 sec)Dalam hasil tersebut, 0 adalah nilai default MySQL. Jalankan perintah berikut untuk melihat pesan peringatan:
SHOW WARNINGS;Hasil berikut dikembalikan:
+---------+------+-----------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------+ | Warning | 1364 | Field 'id' doesn't have a default value | +---------+------+-----------------------------------------+ 1 row in set (0.00 sec)
Parameter
Anda dapat melihat atau mengubah parameter berikut pada halaman di Konsol PolarDB:
Parameter | Ruang Lingkup | Deskripsi |
loose_csv_oss_buff_size | Session | Menetapkan jumlah memori dalam byte yang dapat digunakan oleh satu thread OSS. Nilai default adalah 134217728. Nilai valid: 4096 hingga 134217728 |
loose_csv_max_oss_threads | Global | Menetapkan jumlah maksimum thread OSS konkuren. Nilai default adalah 1. Nilai valid: 1 hingga 100 |
Total memori maksimum untuk fitur OSS dihitung sebagai: loose_csv_max_oss_threads * loose_csv_oss_buff_size.
Untuk mencegah masalah kehabisan memori, total memori untuk fitur OSS tidak boleh melebihi 5% dari memori node saat ini.
Prosedur
Buat server OSS
Buat server OSS untuk menambahkan informasi koneksi dan terhubung ke OSS.
Karena alasan keamanan, membuat server OSS adalah satu-satunya metode yang didukung untuk terhubung ke OSS.
Versi terbaru
Jika kluster database Anda memenuhi salah satu kondisi berikut, gunakan sintaks berikut:
Versi kernel adalah MySQL 8.0.1, dan revisinya 8.0.1.1.28 atau lebih baru.
Versi kernel adalah MySQL 8.0.2, dan revisinya 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 opsional
DATABASEsetara denganoss_prefix. Kami menyarankan menggunakanoss_prefix.Untuk menggunakan parameter
oss_sts_token, salah satu kondisi berikut harus terpenuhi:Versi kernel adalah MySQL 8.0.1, dan revisinya 8.0.1.1.29 atau lebih baru.
Versi kernel adalah MySQL 8.0.2, dan revisinya 8.0.2.2.6 atau lebih baru.
Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter | Tipe | Wajib | Deskripsi |
server_name | String | Ya | Nama server OSS. Catatan Parameter ini bersifat global dan harus unik. Nama tidak membedakan huruf besar/kecil dan memiliki panjang maksimum 64 karakter. Nama yang lebih panjang dari 64 karakter akan dipotong secara otomatis. Anda dapat menentukan nama server OSS sebagai string yang diapit tanda kutip. |
my_database_name | String | Tidak | Direktori di OSS yang berisi file data CSV. Catatan Jika kedua parameter |
my_oss_endpoint | String | Ya | Titik akhir untuk wilayah OSS yang sesuai. Catatan Jika Anda mengakses database dari host Alibaba Cloud, gunakan Titik akhir internal yang namanya mengandung "internal" untuk menghindari lalu lintas jaringan publik. Contohnya, Titik akhir internal untuk wilayah Tiongkok (Hangzhou) adalah |
my_oss_bucket | String | Ya | Bucket OSS tempat file data disimpan. Anda harus membuat bucket ini di OSS terlebih dahulu. Catatan Untuk performa terbaik, letakkan bucket OSS dan kluster database PolarDB di zona ketersediaan yang sama 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 | AccessKey Secret Pengguna RAM atau Akun Alibaba Cloud. |
my_oss_prefix | String | Tidak | Direktori di OSS yang berisi file data CSV. |
my_oss_sts_token | String | Tidak | Kredensial akses sementara STS. Catatan
|
Versi lama
Jika kluster database Anda memenuhi salah satu kondisi berikut, gunakan sintaks berikut:
Versi kernel adalah MySQL 8.0.1, dan revisinya dari 8.0.1.1.25.4 hingga 8.0.1.1.27.
Versi kernel adalah MySQL 8.0.2, dan revisinya dari 8.0.2.2.1 hingga 8.0.2.2.4.
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>"}'
); Pada versi ini, sintaks tidak mendukung parameter oss_prefix dan oss_sts_token.
Tabel berikut menjelaskan parameter-parameter tersebut.
Parameter | Jenis | Wajib | Deskripsi |
server_name | String | Ya | Nama server OSS. Catatan Parameter ini bersifat global dan harus unik. Nama tidak membedakan huruf besar/kecil dan memiliki panjang maksimum 64 karakter. Nama yang lebih panjang dari 64 karakter akan dipotong secara otomatis. Anda dapat menentukan nama server OSS sebagai string yang diapit tanda kutip. |
my_database_name | String | Tidak | Nama direktori di OSS yang berisi file data CSV. |
my_oss_endpoint | String | Ya | Titik akhir untuk wilayah OSS yang sesuai. Catatan Jika Anda mengakses database dari host Alibaba Cloud, gunakan Titik akhir internal yang namanya mengandung "internal" untuk menghindari lalu lintas jaringan publik. Contoh: |
my_oss_bucket | String | Ya | Bucket OSS tempat file data disimpan. Anda harus membuat bucket di OSS terlebih dahulu. |
my_oss_access_key_id | String | Ya | ID AccessKey Pengguna RAM atau Akun Alibaba Cloud. |
my_oss_access_key_secret | String | Ya | AccessKey Secret Pengguna RAM atau Akun Alibaba Cloud. |
Membuat server OSS memerlukan izin SERVERS_ADMIN. Anda dapat menjalankan perintah SHOW GRANTS FOR <username>; untuk memeriksa apakah pengguna saat ini memiliki izin SERVERS_ADMIN. Saat ini, akun dengan hak istimewa tinggi memiliki izin ini secara default dan dapat memberikannya kepada akun dengan hak istimewa rendah.
Jika Anda tidak memiliki hak istimewa
SERVERS_ADMIN, kesalahan berikut akan dikembalikan:Access denied; you need (at least one of) the SERVERS_ADMIN OR SUPER privilege(s) for this operation.Jika Anda menggunakan akun standar yang tidak memiliki hak istimewa
SERVERS_ADMIN, akun dengan hak istimewa tinggi dapat memberikan hak istimewa tersebut dengan menjalankan:GRANT SERVERS_ADMIN ON *.* TO `users`@`%` WITH GRANT OPTION.Jika Anda memiliki akun dengan hak istimewa tinggi tetapi tidak memiliki izin
SERVERS_ADMIN, buka halaman di Konsol PolarDB dan atur ulang izinnya. Tunggu beberapa saat lalu periksa kembali akun dengan hak istimewa tinggi tersebut. Akun tersebut kemudian akan diberikan izinSERVERS_ADMIN. Jika akun dengan hak istimewa tinggi masih belum memiliki izinSERVERS_ADMINsetelah mencoba langkah-langkah ini, silakan kirim tiket untuk menghubungi kami, atau hubungi kami dengan mencari nomor grup kami di DingTalk.Akun dengan hak istimewa tinggi dapat melihat informasi server OSS dengan menjalankan
SELECT Server_name, Extra_server_info FROM mysql.servers;. Untuk keamanan, nilai parameteross_access_key_iddanoss_access_key_secretdienkripsi dan tidak dapat dilihat.
Unggah data
Anda dapat menggunakan tool baris perintah ossutil untuk mengunggah file CSV lokal ke Object Storage Service (OSS).
Direktori OSS tempat Anda mengunggah file CSV harus sesuai dengan direktori yang ditentukan dalam parameter
DATABASEatauoss_prefixserver OSS.Nama file CSV yang diunggah harus dalam format
<foreign_table_name>.CSV, dengan ekstensi.CSVdalam huruf kapital. Misalnya, jika tabel eksternal OSS bernamat1, file CSV harus diberi namat1.CSV.Bidang data dalam file CSV harus sesuai dengan kolom tabel eksternal OSS. Misalnya, jika tabel eksternal OSS
t1memiliki satu kolomidbertipeINT, file CSV yang diunggah juga harus hanya berisi satu bidangINT.Kami menyarankan agar Anda langsung mengunggah file data dari database MySQL lokal Anda dan membuat tabel eksternal OSS yang sesuai berdasarkan definisi tabel tersebut.
Buat tabel eksternal OSS
Setelah Anda menentukan server OSS, buat tabel eksternal OSS di PolarDB untuk memetakan ke file CSV di OSS. Contoh:
CREATE TABLE <table_name> (create_definition,...) engine=csv connection="<connection_string>";connection_string terdiri dari bagian-bagian berikut, yang digabungkan dengan garis miring (/):
Nama server OSS.
(Opsional) Path ke file data di OSS.
CatatanPath file data hanya didukung jika salah satu kondisi berikut terpenuhi.
Versi kernel adalah MySQL 8.0.1, dan revisinya 8.0.1.1.28 atau lebih baru.
Versi kernel adalah MySQL 8.0.2, dan revisinya 8.0.2.2.5 atau lebih baru.
(Opsional) Nama file data.
CatatanJangan sertakan akhiran
.CSVdalam nama file data.Jika Anda tidak menentukan nama file data, file OSS yang sesuai dengan tabel saat ini adalah
<current_table_name>.CSV. Jika Anda menentukan nama file data, file OSS yang sesuai adalah<specified_data_file_name>.CSV.Jika Anda menentukan path ke file data di OSS, Anda juga harus menentukan nama file data. Jika tidak, sistem akan menganggap segmen terakhir dari path sebagai nama file.
Lihat tabel eksternal OSS
Setelah tabel eksternal OSS dibuat, Anda dapat melihat definisinya dengan menjalankan SHOW CREATE TABLE <table_name>;. Periksa apakah engine tabelnya adalah CSV (yaitu, ENGINE=CSV). Jika tidak, versi kluster database PolarDB Anda mungkin terlalu lama untuk mendukung engine OSS. Untuk informasi lebih lanjut, lihat Prasyarat.
Contoh
CREATE TABLE t1 (id int) engine=csv connection="server_name/a/b/c/d/t1";Contoh ini menunjukkan komposisi connection_string:
Nama server OSS:
server_name.Path ke file data di OSS:
oss_prefix/a/b/c/d/.File data:
t1. File aktualnya adalaht1.CSV, tetapi akhiran.CSVdihilangkan sesuai persyaratan.
Anda hanya dapat menentukan file data untuk tabel eksternal OSS berdasarkan nama. Misalnya, dalam pernyataan berikut, PolarDB mencari file t2.CSV di path oss_prefix di OSS.
CREATE TABLE t1 (id int) engine=csv connection="server_name/t2";Kueri data
Contoh berikut mengkueri tabel t1 yang dibuat pada langkah sebelumnya.
-- Menghitung jumlah baris dalam tabel t1.
SELECT count(*) FROM t1;
-- Kueri rentang.
SELECT id FROM t1 WHERE id < 10 AND id > 1;
-- Kueri titik.
SELECT id FROM t1 where id = 3;
-- Penggabungan tabel.
SELECT id FROM t1 left join t2 on t1.id = t2.id WHERE t2.name like "%er%";Tabel berikut menjelaskan kesalahan umum yang mungkin terjadi selama kueri data dan solusinya.
Jika kueri mengembalikan peringatan alih-alih kesalahan, jalankan SHOW WARNINGS; untuk melihat detail peringatan.
Pesan kesalahan | Penyebab | Solusi |
OSS error: No corresponding data file on the OSS engine. | File data yang sesuai tidak ditemukan di OSS. | Periksa apakah file data ada di path yang diharapkan di OSS.
|
There is not enough memory space for OSS transmission. Currently requested memory %d. | Memori tidak mencukupi untuk kueri OSS. | Untuk mengatasi kesalahan ini:
|
ERROR 8054 (HY000): OSS error: error message : Couldn't connect to server.Failed connect to aliyun-mysql-oss.oss-cn-hangzhou-internal.aliyuncs.com:80; | Kluster database tidak dapat terhubung ke server OSS. | Periksa apakah instansiasi basis data dan bucket OSS berada di zona ketersediaan yang sama.
|
Pengoptimalan kueri
Engine OSS meningkatkan performa kueri dengan meneruskan kondisi yang memenuhi syarat ke engine OSS remote. Pengoptimalan ini disebut engine condition pushdown. Batasan berikut berlaku untuk penurunan kondisi:
Hanya file teks CSV berkode UTF-8 yang didukung.
Dalam pernyataan SQL, hanya jenis operator dan ekspresi aritmetika berikut yang didukung:
Operator perbandingan:
>,<,>=,<=,==Operator logika:
LIKE,IN,AND,OREkspresi aritmetika:
+,-,*,/
Hanya kueri file tunggal yang didukung. Kueri yang menggunakan klausa
JOIN,ORDER BY,GROUP BY, atauHAVINGtidak didukung.Klausa WHERE tidak boleh berisi operasi agregasi. Misalnya,
where max(age) > 100tidak diizinkan.Jumlah maksimum kolom adalah 1.000, dan panjang maksimum nama kolom dalam pernyataan SQL adalah 1.024 byte.
Dalam klausa LIKE, hingga lima karakter wildcard
%didukung.Dalam klausa IN, hingga 1.024 konstanta didukung.
Untuk file CSV, ukuran maksimum adalah 256 KB per baris dan 256 KB per kolom.
Panjang maksimum pernyataan SQL adalah 16 KB. Klausa WHERE dapat berisi hingga 20 ekspresi, dan kueri dapat berisi hingga 100 operasi agregasi.
Fitur ini dinonaktifkan secara default. Untuk mengaktifkannya, jalankan perintah SET SESSION optimizer_switch='engine_condition_pushdown=on';.
Kueri yang memenuhi kondisi ini akan diteruskan ke engine OSS. Periksa rencana eksekusi tabel eksternal OSS untuk melihat kondisi mana yang diteruskan.
Gunakan
EXPLAINuntuk melihat rencana eksekusi tabel eksternal OSS. 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 | Using where; With pushed engine condition ((`test`.`t1`.`id` > 5) and (`test`.`t1`.`id` < 100)); Using temporary; Using filesort | +----+-------------+-------+------------+------+---------------+------+---------+------+-------+----------+----------------------------------------------------------------------------------------------------------------------------------+ 1 row in set, 1 warning (0.00 sec)Kondisi setelah
With pushed engine conditionditeruskan ke engine OSS remote. Kondisi yang tersisa,`name` LIKE "%1%%%%%"danGROUP BY `id` ORDER BY `id` DESC, tidak diteruskan dan hanya dieksekusi di server OSS lokal.Gunakan format
treeuntuk melihat rencana eksekusi tabel eksternal OSS. Contoh:EXPLAIN FORMAT=tree SELECT SELECT count(*) FROM `t1` WHERE `id` > 5 AND `id` < 100 AND `name` LIKE "%1%%%%%" GROUP BY `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)Kondisi setelah
engine conditions:diteruskan ke engine OSS remote. Kondisi yang tersisa,`name` LIKE "%1%%%%%"danGROUP BY `id` ORDER BY `id` DESC, tidak diteruskan dan hanya dieksekusi di server OSS lokal.CatatanKluster Anda harus menjalankan PolarDB for MySQL 8.0.2 atau lebih baru. Anda dapat mengonfirmasi versi kluster dengan mengikuti petunjuk di Memeriksa nomor versi.
Gunakan format
JSONuntuk melihat rencana eksekusi tabel eksternal OSS. 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)Seperti sebelumnya, kondisi dalam field
engine_conditionditeruskan ke engine OSS remote. Kondisi yang tersisa,`name` LIKE "%1%%%%%"danGROUP BY `id` ORDER BY `id` DESC, tidak diteruskan dan hanya dieksekusi di server OSS lokal.
Jika Anda menerima kesalahan berikut, artinya beberapa karakter dalam file data OSS tidak kompatibel dengan penurunan kondisi engine.
OSS error: The current query does not support engine condition pushdown. You need to use NO_ECP() hint or set optimizer_switch = 'engine_condition_pushdown=OFF' to turn off the condition push down function.Anda dapat menonaktifkan penurunan kondisi engine secara manual dengan menggunakan hint atau optimizer_switch.
Hints
Gunakan hint untuk menonaktifkan penurunan kondisi engine untuk kueri tertentu. Misalnya, untuk menonaktifkan penurunan kondisi engine untuk tabel
t1:SELECT /*+ NO_ECP(t1) */ `j` FROM `t1` WHERE `j` LIKE "%c%" LIMIT 10;optimizer_switch
Gunakan
optimizer_switchuntuk menonaktifkan penurunan kondisi engine untuk semua kueri dalam sesi saat ini.SET SESSION optimizer_switch='engine_condition_pushdown=off'; # Nonaktifkan penurunan kondisi engine untuk sesi saat ini.Untuk memeriksa status penurunan kondisi engine untuk sesi saat ini, jalankan perintah berikut:
select @@optimizer_switch;
Menyinkronkan informasi server OSS
Node primary dan node read-only dalam kluster PolarDB berbagi satu server OSS, memungkinkan akses data dari semua node. Sinkronisasi tanpa penguncian ini memastikan bahwa operasi pada setiap node tetap independen.
Saat Anda mengubah informasi server OSS, perubahan tersebut disinkronkan ke node read-only tanpa penguncian. Jika thread pada node read-only memegang kunci pada server OSS, sinkronisasi ini mungkin tertunda. Dalam kasus ini, jalankan /*force_node='pi-bpxxxxxxxx'*/ flush privileges; atau /*force_node='pi-bpxxxxxxxx'*/flush table oss_foreign_table; untuk memperbarui secara manual informasi server OSS pada node read-only.