PolarDB mendukung fitur eliminasi left join. Untuk query kompleks, Anda dapat menggunakan fitur ini untuk mentransformasi query SQL dan menghapus subquery left join yang tidak diperlukan, sehingga meningkatkan performa query SQL.
Prasyarat
Kluster PolarDB for MySQL 8.0 harus memiliki versi revisi berikut:
8.0.1.1.32 atau lebih baru
8.0.2.2.10 atau lebih baru
Batasan
Untuk menggunakan fitur eliminasi left join, persyaratan berikut harus dipenuhi:
Setiap baris data di tabel kiri hanya boleh memiliki satu baris di tabel kanan yang memenuhi kondisi join.
Selain subquery
left join, tidak ada data di tabel kanan yang dirujuk dalam pernyataan SQL saat ini.
Informasi latar belakang
Operator left join banyak digunakan dalam query analitik kompleks dan sering menjadi bagian paling memakan waktu dalam pernyataan SQL. Operasi join menggabungkan kolom yang ditentukan di tabel kiri dan tabel kanan serta mengintegrasikan hasilnya dengan query luar, sehingga memperumit query. Menghilangkan operasi join yang tidak diperlukan dapat secara signifikan meningkatkan performa query.
Penggunaan
Anda dapat menggunakan parameter loose_join_elimination_mode untuk mengaktifkan fitur eliminasi left join. Untuk informasi lebih lanjut, lihat Tentukan parameter kluster dan node.
Parameter | Tingkat | Deskripsi |
loose_join_elimination_mode | Global | Menentukan apakah akan mengaktifkan fitur eliminasi left join. Nilai default: REPLICA_ON. Nilai valid:
|
Contoh
Query Asli
Dalam query asli, table1, table2, dan table3 di-left-join. Query ini membutuhkan waktu 7,5 detik untuk dieksekusi.
EXPLAIN
SELECT count(*)
FROM `table1` `sc`
LEFT JOIN `table2` `ca` ON `sc`.`car_id` = `ca`.`id`
LEFT JOIN `table3` `co` ON `sc`.`company_id` = `co`.`id`;
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+
| 1 | SIMPLE | sc | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | NULL |
| 1 | SIMPLE | ca | NULL | eq_ref | PRIMARY | PRIMARY | 4 | je_test.sc.car_id | 1 | 100.00 | Using index |
| 1 | SIMPLE | co | NULL | eq_ref | PRIMARY | PRIMARY | 4 | je_test.sc.company_id | 1 | 100.00 | Using index |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+Primary key dari table1 digunakan dalam kondisi untuk menggabungkan table2 dan table3, memastikan baris unik dalam hasil query. Karena tidak ada kolom di table2 atau table3 yang dirujuk dalam proyeksi, left join dapat dieliminasi.
Query Dioptimalkan
EXPLAIN
SELECT count(*)
FROM `table1` `sc`
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | sc | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+Query di atas menunjukkan bahwa hanya catatan dari table1 yang di-query setelah penggabungan table2 dan table3 dieliminasi. Hal ini menghemat sumber daya komputasi secara signifikan dan meningkatkan efisiensi eksekusi. Query yang dioptimalkan membutuhkan waktu 0,1 detik, yaitu 1/75 dari waktu query aslinya.