全部产品
Search
文档中心

PolarDB:Gunakan fitur filter file OSS untuk mempercepat kueri data dingin

更新时间:Jul 06, 2025

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 OSS pada tabel, tabel tersebut harus memiliki opsi OSS META = 1. Anda dapat menjalankan pernyataan SHOW CREATE TABLE untuk memeriksa apakah OSS META diaktifkan untuk tabel saat ini dalam format CSV. Jika hasilnya berisi OSS META=1, OSS META diaktifkan 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 UNSIGNED

    Floating-point

    FLOAT, DOUBLE

    Fixed-point

    DECIMAL

    Waktu

    DATE, DATETIME, TIME, TIMESTAMP

    String

    CHAR, VARCHAR

  • Semua 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

  1. Di konsol, atur parameter kluster loose_use_oss_meta ke ON untuk mengaktifkan fitur USE_OSS_META. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameter kluster, lihat Konfigurasikan parameter kluster dan node.

  2. Di konsol, atur parameter kluster loose_optimizer_switch ke ENGINE_CONDITION_PUSHDOWN=ON. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameter kluster, lihat Konfigurasikan parameter kluster dan node.

  3. Di konsol, atur parameter kluster loose_csv_oss_file_filter ke ON untuk mengaktifkan fitur filter file OSS. Untuk informasi lebih lanjut tentang cara mengonfigurasi parameter kluster, lihat Konfigurasikan parameter kluster dan node.

  4. 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 := bloom

Jenis 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;