Topik ini menjelaskan cara menggunakan fitur filter file OSS untuk mempercepat kueri data dingin.
Informasi latar belakang
Dengan penerapan luas OSS, semakin banyak data yang disimpan di OSS. Masalah kinerja kueri rendah terus memburuk dan memengaruhi pengalaman pengguna. Meskipun eksekusi kueri paralel pada data dingin dapat mempercepat kueri, eksekusi kueri paralel pada data dingin mengonsumsi banyak sumber daya memori, koneksi, dan lebar pita jaringan selama proses pemindaian tabel OSS. Pengalaman pengguna masih terpengaruh. Oleh karena itu, diperlukan metode penyaringan cepat data tabel OSS untuk meningkatkan kinerja kueri.
Untuk mengatasi tantangan tersebut, fitur filter file OSS diperkenalkan. Fitur ini mengecualikan blok data OSS yang tidak perlu dipindai berdasarkan kondisi kueri. Hal ini mengurangi jumlah data yang dipindai dan secara signifikan meningkatkan kinerja kueri. Selain mengoptimalkan efisiensi sumber daya, fitur ini juga meningkatkan pengalaman pengguna.
Ikhtisar fitur
Fitur filter file OSS mengumpulkan statistik pada setiap blok data arsip, menghasilkan data filter, dan menyimpan data filter di OSS. Sistem mengecualikan blok data yang tidak perlu dipindai berdasarkan kondisi kueri yang didorong dan data filter. Hal ini mengurangi jumlah data yang dipindai serta mempersingkat waktu kueri. Data dingin OSS dapat difilter menggunakan filter file OSS yang Anda buat. Metode penyaringan berbeda digunakan untuk tipe data yang berbeda: data numerik difilter dengan membandingkan statistik minimum dan maksimum blok data, sedangkan data string difilter dengan membandingkan peta karakter. Jika tipe data BLOOM ditentukan, filter BLOOM digunakan.
Fitur filter file OSS bekerja lebih baik untuk data numerik yang terurut atau sebagian terurut. Namun, untuk data yang tidak terurut secara global, filter BLOOM direkomendasikan untuk efisiensi penyaringan yang lebih baik.
Karena data arsip biasanya memiliki seri waktu yang baik, menyaring kolom tipe waktu dapat secara signifikan meningkatkan kinerja kueri.
Prasyarat
Cluster harus berupa MySQL 8.0.2 dengan versi revisi 8.0.2.2.25 atau lebih baru.
Cluster harus memiliki fitur pengarsipan data dingin yang diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan pengarsipan data dingin.
Koneksi ke cluster telah dibuat. Untuk informasi lebih lanjut, lihat Hubungkan ke cluster.
Anda hanya dapat membuat filter file OSS untuk data dingin OSS dalam format CSV.
Untuk mengaktifkan fitur
filter file OSSpada tabel, tabel tersebut harus memiliki opsiOSS META = 1. Anda dapat menjalankan pernyataanSHOW CREATE TABLEuntuk memeriksa apakahOSS METAdiaktifkan untuk tabel saat ini dalam format CSV. Jika hasilnya berisiOSS META=1,OSS METAdiaktifkan untuk tabel tersebut. Untuk informasi lebih lanjut, lihat Lakukan operasi DDL pada data dingin.SHOW CREATE TABLE t; *************************** 1. row *************************** Table: t Create Table: CREATE TABLE `t` ( `id` int(11) DEFAULT NULL ) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */ 1 row in set (0.00 sec)
Batasan
Anda tidak dapat mengaktifkan fitur filter file OSS setelah fitur ePQ diaktifkan.
Fungsi berikut didukung dalam fitur filter file OSS: =, <=>, <, <=, >=,>, BETWEEN, LIKE, IS NULL, dan IS NOT NULL. Tanda persen hanya dapat ditambahkan di sebelah kanan variabel dalam LIKE (LIKE 'ABC%').
Tabel berikut mencantumkan tipe data yang didukung dalam fitur filter file OSS.
Kategori
Tipe data
Integer
TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,TINYINT UNSIGNED,SMALLINT UNSIGNED,MEDIUMINT UNSIGNED,INT UNSIGNE,BIGINT UNSIGNEDFloating-point
FLOAT,DOUBLEFixed-point
DECIMALWaktu
DATE,DATETIME,TIME,TIMESTAMPString
CHAR,VARCHARSemua tipe data didukung dalam filter BLOOM.
Jika UUID disimpan dalam string, kami sarankan Anda membuat filter BLOOM.
Untuk kolom tipe string, hanya perbandingan case-sensitive yang didukung.
Operasi AND antara beberapa kondisi didukung, tetapi operasi OR antara beberapa kondisi tidak didukung.
Jika tabel OSS tidak memiliki data, Anda tidak dapat menggunakan fitur filter file OSS untuk akselerasi kueri.
Prosedur
Di konsol, atur parameter kluster
loose_use_oss_metake ON untuk mengaktifkan fiturUSE_OSS_META. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameter kluster, lihat Konfigurasikan parameter kluster dan node.Di konsol, atur parameter kluster
loose_optimizer_switchkeENGINE_CONDITION_PUSHDOWN=ON. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameter kluster, lihat Konfigurasikan parameter kluster dan node.Di konsol, atur parameter kluster
loose_csv_oss_file_filterke ON untuk mengaktifkan fiturfilter file OSS. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameter kluster, lihat Konfigurasikan parameter kluster dan node.Pastikan bahwa kluster terhubung. Jika tidak, Anda dapat menghubungkan ke kluster sesuai dengan Hubungkan ke cluster. Periksa apakah parameter di atas telah dikonfigurasi.
-- Periksa apakah parameter loose_csv_oss_file_filter diatur ke ON SHOW VARIABLES LIKE 'oss_file_filter'; -- Periksa apakah parameter use_oss_meta diatur ke ON. SHOW VARIABLES LIKE 'use_oss_meta'; -- Periksa apakah parameter loose_optimizer_switch diatur ke ENGINE_CONDITION_PUSHDOWN=ON. SHOW VARIABLES LIKE 'optimizer_switch';
Jenis filter file OSS
Anda dapat menentukan data filter file OSS untuk tabel arsip dengan menambahkan opsi OSS_FILE_FILTER. Opsi OSS_FILE_FILTER berada dalam format berikut:
OSS_FILE_FILTER = 'field_filter[,field_filter]'
field_filter := field_name[:filter_type]
filter_type := bloomJenis filter file OSS default didefinisikan untuk tipe data yang berbeda. Secara default, data numerik dan waktu difilter dengan membandingkan statistik minimum dan maksimum. Data string difilter dengan membandingkan peta karakter. Semua tipe data dapat difilter dengan menggunakan filter BLOOM.
Contoh
Buat filter file OSS saat mengarsipkan tabel secara manual
Anda dapat membuat filter file OSS saat mengarsipkan tabel secara manual.
-- Buat tabel yang menggunakan struktur yang ditentukan.
CREATE TABLE `lineitem` (
`L_ORDERKEY` int(11) NOT NULL,
`L_PARTKEY` int(11) NOT NULL,
`L_SUPPKEY` int(11) NOT NULL,
`L_LINENUMBER` int(11) NOT NULL,
`L_QUANTITY` decimal(15,2) NOT NULL,
`L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
`L_DISCOUNT` decimal(15,2) NOT NULL,
`L_TAX` decimal(15,2) NOT NULL,
`L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
`L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
`L_SHIPDATE` date NOT NULL,
`L_COMMITDATE` date NOT NULL,
`L_RECEIPTDATE` date NOT NULL,
`L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
`L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
`L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = innodb;
-- Arsipkan tabel dan buat filter file OSS di kolom L_ORDERKEY, L_LINENUMBER, dan L_SHIPDATE dari tabel.
ALTER TABLE lineitem ENGINE = CSV STORAGE OSS
OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE';Buat filter file OSS di tabel arsip
Anda dapat membuat filter file OSS di tabel arsip.
-- Buat tabel yang menggunakan struktur yang ditentukan.
CREATE TABLE `lineitem` (
`L_ORDERKEY` int(11) NOT NULL,
`L_PARTKEY` int(11) NOT NULL,
`L_SUPPKEY` int(11) NOT NULL,
`L_LINENUMBER` int(11) NOT NULL,
`L_QUANTITY` decimal(15,2) NOT NULL,
`L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
`L_DISCOUNT` decimal(15,2) NOT NULL,
`L_TAX` decimal(15,2) NOT NULL,
`L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
`L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
`L_SHIPDATE` date NOT NULL,
`L_COMMITDATE` date NOT NULL,
`L_RECEIPTDATE` date NOT NULL,
`L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
`L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
`L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = CSV STORAGE OSS;
-- Buat filter file OSS di kolom L_ORDERKEY, L_LINENUMBER, L_SHIPDATE, dan L_SHIPINSTRUCT dari tabel arsip. Kolom L_SHIPINSTRUCT menggunakan tipe data BLOOM.
ALTER TABLE lineitem OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE,L_SHIPINSTRUCT:BLOOM';Gunakan filter file OSS
Jika filter file OSS digunakan dalam kondisi kueri, kondisi kueri didorong ke data dingin OSS dalam format CSV. Anda dapat meminta rencana eksekusi untuk melihat kondisi yang didorong.
-- Buat tabel yang menggunakan struktur yang ditentukan.
CREATE TABLE `lineitem` (
`L_ORDERKEY` int(11) NOT NULL,
`L_PARTKEY` int(11) NOT NULL,
`L_SUPPKEY` int(11) NOT NULL,
`L_LINENUMBER` int(11) NOT NULL,
`L_QUANTITY` decimal(15,2) NOT NULL,
`L_EXTENDEDPRICE` decimal(15,2) NOT NULL,
`L_DISCOUNT` decimal(15,2) NOT NULL,
`L_TAX` decimal(15,2) NOT NULL,
`L_RETURNFLAG` char(1) COLLATE utf8_bin NOT NULL,
`L_LINESTATUS` char(1) COLLATE utf8_bin NOT NULL,
`L_SHIPDATE` date NOT NULL,
`L_COMMITDATE` date NOT NULL,
`L_RECEIPTDATE` date NOT NULL,
`L_SHIPINSTRUCT` char(25) COLLATE utf8_bin NOT NULL,
`L_SHIPMODE` char(10) COLLATE utf8_bin NOT NULL,
`L_COMMENT` varchar(44) COLLATE utf8_bin NOT NULL
) ENGINE = CSV STORAGE OSS OSS_FILE_FILTER = 'L_ORDERKEY,L_LINENUMBER,L_SHIPDATE';
-- Kueri rencana eksekusi.
explain select * from lineitem where l_orderkey=96;
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 6001215 | 10.00 | Using where; With pushed engine condition (`test`.`lineitem`.`L_ORDERKEY` = 96) |
+----+-------------+----------+------------+------+---------------+------+---------+------+---------+----------+---------------------------------------------------------------------------------+
explain format = tree select * from lineitem where l_orderkey=96 \G
*************************** 1. row ***************************
EXPLAIN: -> Filter: (lineitem.L_ORDERKEY = 96) (cost=15010.00 rows=10000)
-> Table scan on lineitem, extra (oss_file_filter conditions: (lineitem.L_ORDERKEY = 96)) (cost=15010.00 rows=100000)
-- Jalankan pernyataan kueri SQL.
select count(*) from lineitem where l_orderkey=96;