Topik ini menjelaskan cara menggunakan fitur Elastic Parallel Query (ePQ) dalam kluster PolarDB for MySQL untuk mengoptimalkan kinerja query pada data dingin.
Informasi latar belakang
Seiring meningkatnya volume data yang disimpan di tabel Object Storage Service (OSS), kinerja query pada tabel OSS menurun, yang secara signifikan memengaruhi pengalaman pengguna. Anda dapat menggunakan fitur ePQ untuk menyelesaikan masalah tersebut. Fitur ePQ secara signifikan mempercepat eksekusi query dengan meningkatkan jumlah thread pekerja, mengoptimalkan proses query, meningkatkan efisiensi pengambilan data, dan memastikan akses cepat ke informasi yang diperlukan.
Deskripsi
Eksekusi query paralel pada data dingin hanya didukung untuk format CSV. Fitur ini menetapkan tugas berbeda kepada pekerja independen. Para pekerja memindai data CSV di tabel OSS secara paralel, yang secara signifikan meningkatkan kecepatan query. Tabel berikut menjelaskan mekanisme kerjanya.

Versi yang didukung
Kluster harus memenuhi persyaratan versi dan edisi berikut:
Eksekusi query paralel satu node pada data dingin:
Mesin basis data: MySQL 8.0.1 dengan versi revisi 8.0.1.1.34 atau lebih baru.
Edisi: Enterprise Edition/.
Eksekusi query paralel satu node pada data dingin:
Mesin basis data: MySQL 8.0.2 dengan versi revisi 8.0.2.2.24 atau lebih baru.
Edisi: Enterprise Edition.
Eksekusi query paralel multi-mode pada data dingin:
Mesin basis data: MySQL 8.0.2 dengan versi revisi 8.0.2.2.24 atau lebih baru.
Edisi: Enterprise Edition.
Prasyarat
Koneksi ke kluster telah dibuat. Untuk informasi lebih lanjut, lihat Hubungkan ke kluster.
Fitur arsip data dingin telah diaktifkan untuk kluster. Untuk informasi lebih lanjut, lihat Aktifkan arsip data dingin.
Fitur ePQ telah diaktifkan. Untuk informasi lebih lanjut, lihat Aktifkan elastic parallel query.
Data dingin tempat Anda ingin melakukan eksekusi query paralel berada dalam format CSV.
Parameter loose_csv_max_oss_threads diatur dengan nilai lebih besar dari atau sama dengan 2.

Parameter loose_csv_max_oss_threads menentukan jumlah maksimum thread OSS yang dapat dijalankan secara paralel pada sebuah node. Nilai valid untuk parameter loose_csv_max_oss_threads adalah 1 hingga 100. Nilai defaultnya adalah 1. Jika Anda menggunakan nilai default, Anda tidak dapat melakukan eksekusi query paralel pada data dingin. Secara default, satu thread OSS mengonsumsi 128 MB memori. Tingkatkan nilai parameter loose_csv_max_oss_threads berdasarkan sisa memori kluster.
Penggunaan
Dalam contoh-contoh ini, tes berbasis benchmark TPC-H dilakukan. Namun, tes tersebut tidak memenuhi semua persyaratan tes benchmark TPC-H. Oleh karena itu, hasil tes tidak dapat dibandingkan dengan hasil tes benchmark TPC-H yang dipublikasikan. Untuk informasi lebih lanjut, lihat Tes query TPC-H.
Untuk mengaktifkan eksekusi query paralel pada data dingin, aktifkan fitur ePQ dan konfigurasikan parameter loose_csv_max_oss_threads ke nilai yang cukup besar.
Contoh: Arsipkan tabel bernama lineitem ke OSS.
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)Anda dapat menggunakan beberapa metode untuk mengaktifkan eksekusi query paralel. Misalnya, Anda dapat menambahkan hint dalam query Anda untuk mengaktifkan eksekusi query paralel. Untuk menentukan apakah eksekusi query paralel diaktifkan, jalankan pernyataan EXPLAIN dan periksa apakah Parallel scan ditampilkan di kolom Extra. Jika ditampilkan di kolom tersebut, eksekusi query paralel diaktifkan. Jumlah pekerja mewakili derajat paralelisme.
Eksekusi query serial
Jalankan pernyataan EXPLAIN dan periksa apakah Parallel scan ditampilkan di kolom Extra. Jika tidak ditampilkan di kolom tersebut, eksekusi query paralel dinonaktifkan.
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)Output sebelumnya menunjukkan bahwa perhitungan agregat dan pemindaian tabel dilakukan secara berurutan dalam satu thread. Eksekusi query paralel dinonaktifkan.
Eksekusi query paralel
Jika Anda menambahkan hint(/*+ PARALLEL(4) */) dalam query untuk mengaktifkan eksekusi query paralel, rencana eksekusi menunjukkan bahwa eksekusi query paralel dilakukan pada tabel lineitem. Informasi Parallel scan (4 pekerja) yang ditampilkan di kolom Extra dalam rencana eksekusi menunjukkan bahwa query dieksekusi secara paralel oleh empat thread 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 | 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)Output sebelumnya menunjukkan bahwa empat pekerja diaktifkan pada node saat ini. Ini berarti bahwa eksekusi query paralel dilakukan. Kecepatan query keseluruhan empat kali lipat dari query single-thread.
Query paralel multi-node
Rencana eksekusi menunjukkan bahwa Parallel scan digunakan dalam query untuk tabel lineitem. Setiap node menggunakan empat pekerja, dan total dua node dan delapan pekerja digunakan untuk eksekusi paralel. Kolom Extra menunjukkan jumlah pekerja dan jumlah node.
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)Output sebelumnya menunjukkan bahwa dua node dan delapan thread digunakan untuk query paralel. Eksekusi query paralel multi-node diaktifkan, dan kecepatan query keseluruhan delapan kali lipat dari kecepatan query single-thread.