Elastic Parallel Query (ePQ) mempercepat kueri terhadap data dingin yang disimpan dalam tabel OSS dengan mendistribusikan beban kerja ke beberapa thread pekerja—baik pada satu node maupun secara simultan di beberapa node.
Cara kerja
ePQ menetapkan tugas pemindaian independen kepada Parallel Worker. Setiap pekerja membaca sebagian data CSV dalam tabel OSS secara konkuren, lalu hasilnya diagregasi. Tingkat paralelisme dikendalikan oleh jumlah pekerja dan jumlah node yang terlibat.

Kueri paralel pada data dingin hanya mendukung format CSV.
Versi yang didukung
Semua mode memerlukan Enterprise Edition.
| Mode | Mesin database | Versi revisi minimum |
|---|---|---|
| Kueri paralel node tunggal (MySQL 8.0.1) | MySQL 8.0.1 | 8.0.1.1.34 |
| Kueri paralel node tunggal (MySQL 8.0.2) | MySQL 8.0.2 | 8.0.2.2.24 |
| Kueri paralel multi-node | MySQL 8.0.2 | 8.0.2.2.24 |
Prasyarat
Sebelum memulai, pastikan Anda telah:
Tersambung ke kluster. Lihat Connect to a cluster
Mengaktifkan pengarsipan data dingin pada kluster. Lihat Enable cold data archiving
Mengaktifkan fitur ePQ. Lihat Enable elastic parallel query
Data dingin dalam format CSV
loose_csv_max_oss_threadsdiatur ke 2 atau lebih tinggi

loose_csv_max_oss_threads mengontrol jumlah maksimum thread OSS yang berjalan secara paralel pada satu node. Nilai yang valid: 1–100. Default: 1. Pada nilai default 1, kueri paralel dinonaktifkan. Setiap thread OSS mengonsumsi memori sebesar 128 MB, jadi atur parameter ini berdasarkan memori kluster yang tersedia.Jalankan kueri paralel pada data dingin
Contoh di bawah menggunakan set data TPC-H tetapi tidak memenuhi semua persyaratan pengujian benchmark TPC-H resmi. Hasilnya tidak dapat dibandingkan dengan hasil benchmark TPC-H yang dipublikasikan. Untuk detailnya, lihat TPC-H dataset.
Contoh-contoh berikut menggunakan tabel bernama lineitem yang diarsipkan ke OSS dalam format CSV:
mysql> show create table lineitem;
*************************** 1. row ***************************
Table: lineitem
Create Table: 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(10,2) NOT NULL,
`l_extendedprice` decimal(10,2) NOT NULL,
`l_discount` decimal(10,2) NOT NULL,
`l_tax` decimal(10,2) NOT NULL,
`l_returnflag` char(1) NOT NULL,
`l_linestatus` char(1) NOT NULL,
`l_shipDATE` date NOT NULL,
`l_commitDATE` date NOT NULL,
`l_receiptDATE` date NOT NULL,
`l_shipinstruct` char(25) NOT NULL,
`l_shipmode` char(10) NOT NULL,
`l_comment` varchar(44) NOT NULL
) ENGINE=CSV DEFAULT CHARSET=utf8 /*!99990 800020204 NULL_MARKER='NULL' */ CONNECTION='default_oss_server'
1 row in set (0.00 sec)Untuk mengaktifkan kueri paralel, tambahkan petunjuk /*+ PARALLEL(N) */ ke kueri Anda, di mana N adalah jumlah pekerja per node. Untuk memverifikasi apakah kueri paralel aktif, jalankan EXPLAIN dan periksa kolom Extra:
Extra nilai kolom | Makna |
|---|---|
Parallel scan (N workers) | Kueri paralel aktif; N adalah jumlah total thread pekerja di semua node yang berpartisipasi |
MPP (N nodes) | Kueri paralel multi-node aktif; N adalah jumlah node yang berpartisipasi |
Total paralelisme = pekerja per node × jumlah node.
Kueri serial
Tanpa petunjuk tersebut, kueri dijalankan dalam satu thread. Kolom Extra menampilkan Using where tanpa Parallel scan:
mysql> explain SELECT
-> sum(l_extendedprice * l_discount) AS revenue
-> FROM
-> lineitem
-> WHERE
-> l_shipdate >= date '1994-01-01'
-> AND l_shipdate < date '1994-01-01' + interval '1' year
-> AND l_discount between 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 61560489 | 0.41 | Using where |
+----+-------------+----------+------------+------+---------------+------+---------+------+----------+----------+-------------+
1 row in set, 1 warning (1.23 sec)Tabel dipindai dan diagregasi secara berurutan dalam satu thread.
Kueri paralel node tunggal
Tambahkan /*+ PARALLEL(4) */ untuk mendistribusikan pemindaian ke 4 pekerja pada node saat ini. Parallel scan (4 workers) pada kolom Extra mengonfirmasi bahwa kueri paralel aktif:
mysql> explain SELECT /*+ PARALLEL(4) */
-> sum(l_extendedprice * l_discount) AS revenue
-> FROM
-> lineitem
-> WHERE
-> l_shipdate >= date '1994-01-01'
-> AND l_shipdate < date '1994-01-01' + interval '1' year
-> AND l_discount between 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
| 1 | SIMPLE | <gather1.1> | NULL | ALL | NULL | NULL | NULL | NULL | 4 | 100.00 | NULL |
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 15390122 | 0.41 | Parallel scan (4 workers); Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+----------------------------------------+
2 rows in set, 1 warning (2.17 sec)Empat pekerja berjalan secara paralel pada node saat ini, memberikan throughput sekitar 4 kali lipat dibandingkan kueri single-thread.
Kueri paralel multi-node
Ketika beberapa node berpartisipasi, kolom Extra menampilkan Parallel scan (N workers) dan MPP (N nodes). Di sini, Parallel scan (8 workers) berarti total 8 pekerja aktif di semua node, dan MPP (2 nodes) berarti 2 node berpartisipasi—masing-masing menjalankan 4 pekerja:
mysql> explain SELECT /*+ PARALLEL(4) */
-> sum(l_extendedprice * l_discount) AS revenue
-> FROM
-> lineitem
-> WHERE
-> l_shipdate >= date '1994-01-01'
-> AND l_shipdate < date '1994-01-01' + interval '1' year
-> AND l_discount between 0.05 - 0.01 AND 0.05 + 0.01
-> AND l_quantity < 24;
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
| 1 | SIMPLE | <gather1.1> | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
| 1 | SIMPLE | lineitem | NULL | ALL | NULL | NULL | NULL | NULL | 59986051 | 0.41 | Parallel scan (8 workers); MPP (2 nodes); Using where |
+----+-------------+-------------+------------+------+---------------+------+---------+------+----------+----------+-------------------------------------------------------+
2 rows in set, 1 warning (0.00 sec)Dengan 2 node dan total 8 pekerja, throughput kueri sekitar 8 kali lipat dibandingkan kueri single-thread.
Pemecahan masalah
Jika EXPLAIN tidak menampilkan Parallel scan pada kolom Extra, kueri paralel tidak diaktifkan. Periksa hal-hal berikut:
| Kondisi | Perbaikan |
|---|---|
loose_csv_max_oss_threads bernilai 1 (default) | Atur ke 2 atau lebih tinggi |
| Data dingin tidak dalam format CSV | Konversi data ke format CSV sebelum mengarsipkan |
| Versi kluster tidak memenuhi persyaratan minimum | Tingkatkan ke versi revisi yang didukung (lihat Supported versions) |
| ePQ tidak diaktifkan | Aktifkan ePQ (lihat Enable elastic parallel query) |