All Products
Search
Document Center

PolarDB:Eliminasi\ left\ join

Last Updated:Mar 28, 2026

Skema yang sangat ternormalisasi dan lapisan kueri berbasis tampilan (view) sering menghasilkan SQL dengan banyak klausa LEFT JOIN, yang sebagian besar secara logis redundan—tabel yang di-join tidak memberikan kontribusi apa pun terhadap set hasil. Eliminasi left join menghapus join redundan ini pada tingkat pengoptimal, sehingga database hanya membaca tabel yang benar-benar dibutuhkan. Untuk kueri analitis kompleks, hal ini dapat mengurangi waktu eksekusi hingga satu orde besaran tanpa perubahan apa pun pada SQL Anda.

Cara kerja

Untuk setiap LEFT JOIN dalam suatu kueri, PolarDB for MySQL memeriksa dua kondisi:

  1. Hanya satu baris di tabel kanan yang dapat memenuhi kondisi join untuk setiap baris di tabel kiri.

  2. Tidak ada kolom dari tabel kanan yang muncul dalam daftar SELECT atau di bagian lain kueri.

Jika kedua kondisi terpenuhi, PolarDB menghapus join tersebut dari rencana eksekusi. Pengoptimal menerapkan pemeriksaan ini ke setiap LEFT JOIN dalam kueri, sehingga beberapa join redundan dapat dieliminasi sekaligus.

Prasyarat

Sebelum memulai, pastikan Anda telah memiliki:

  • Kluster PolarDB for MySQL 8.0 dengan versi revisi 8.0.1.1.32 atau lebih baru, atau 8.0.2.2.10 atau lebih baru.

Batasan

Eliminasi left join hanya berlaku ketika kedua kondisi berikut terpenuhi:

  • Untuk setiap baris di tabel kiri, hanya satu baris di tabel kanan yang dapat memenuhi kondisi join.

  • Tidak ada kolom dari tabel kanan yang direferensikan di mana pun dalam pernyataan SQL di luar klausa LEFT JOIN itu sendiri.

Aktifkan eliminasi left join

Atur parameter loose_join_elimination_mode untuk mengontrol kapan fitur ini aktif.

ParameterTingkatDeskripsi
loose_join_elimination_modeGlobalMengontrol eliminasi left join. Nilai default: REPLICA_ON. Nilai yang valid: ON (diaktifkan di semua node), REPLICA_ON (diaktifkan hanya di node read-only), OFF (dinonaktifkan).

Untuk mengubah parameter tersebut, lihat Tentukan parameter kluster dan node.

Catatan

Nilai default REPLICA_ON hanya mengaktifkan fitur ini di node read-only. Untuk mengaktifkannya di semua node, termasuk node primary, atur parameter ke ON.

Verifikasi dengan EXPLAIN

Gunakan EXPLAIN untuk memastikan bahwa eliminasi left join diterapkan pada kueri Anda.

Sebelum optimasi

Kueri berikut melakukan join antara table1 (alias sc), table2 (alias ca), dan table3 (alias co). Setiap baris di table1 cocok dengan hanya satu baris di table2 dan table3, serta tidak ada kolom dari table2 atau table3 yang muncul dalam daftar SELECT—kedua kondisi eliminasi terpenuhi.

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

Output:

+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+
| 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 |
+----+-------------+-------+------------+--------+---------------+---------+---------+-----------------------+------+----------+-------------+

Ketiga tabel muncul dalam rencana eksekusi. Waktu eksekusi: 7,5 detik.

Setelah optimasi

Dengan eliminasi left join diaktifkan, pengoptimal mendeteksi bahwa join ke table2 dan table3 bersifat redundan dan menulis ulang kueri agar hanya memindai table1.

EXPLAIN
SELECT count(*)
FROM `table1` `sc`

Output:

+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+
| 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  |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------+

Hanya table1 yang tersisa dalam rencana eksekusi. Waktu eksekusi: 0,1 detik—75 kali lebih cepat daripada kueri aslinya.

Topik terkait