All Products
Search
Document Center

PolarDB:Mengubah Predikat IN Menjadi JOIN

Last Updated:Aug 28, 2026

PolarDB mendukung pengubahan predikat IN menjadi JOIN. Untuk kueri kompleks yang memenuhi prasyarat, pengoptimal mengonversi predikat IN berukuran besar menjadi JOIN guna meningkatkan performa kueri.

Prasyarat

  • Kluster harus menjalankan PolarDB for MySQL 8.0, versi revisi 8.0.2.2.10 atau yang lebih baru. Untuk informasi selengkapnya, lihat Menanyakan nomor versi.

  • Jumlah elemen dalam daftar IN melebihi nilai parameter loose_in_predicate_conversion_threshold.

  • Kondisi [NOT] IN berada di lapisan teratas klausa WHERE atau ON.

Penggunaan

Anda dapat menggunakan parameter loose_in_predicate_conversion_threshold untuk mengonfigurasi fitur yang mengubah predikat IN menjadi JOIN. Untuk informasi selengkapnya, lihat Mengatur parameter kluster dan node.

Nama Parameter

Tingkat

Deskripsi

loose_in_predicate_conversion_threshold

Global

Mengontrol fitur yang mengubah predikat IN menjadi JOIN.

Jika jumlah elemen dalam daftar IN suatu pernyataan SQL lebih besar dari atau sama dengan nilai parameter ini, pengoptimal akan mengubah predikat IN menjadi JOIN. Nilai yang valid: 0 hingga 18446744073709551615. Nilai default: 5000.

Catatan

Jika Anda mengatur parameter ini ke 0, fitur ini dinonaktifkan.

Contoh

Kueri asli:

mysql> EXPLAIN  SELECT * FROM t WHERE a IN (1,2,3,5,5);
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | t     | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  160 |    50.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)
mysql> EXPLAIN format=tree SELECT * FROM t WHERE a IN (1,2,3,5,5);
+------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                              |
+------------------------------------------------------------------------------------------------------+
| -> Filter: (t.a IN (1,2,3,5,5))  (cost=16.25 rows=80)
    -> TABLE scan ON t  (cost=16.25 rows=160)
 |
+------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Kueri yang diubah:

mysql> SET in_predicate_conversion_threshold=5;
mysql> EXPLAIN  SELECT * FROM t WHERE a IN (1,2,3,5,5);
+----+-------------+------------+------------+--------+---------------------+---------------------+---------+----------+------+----------+--------------------------+
| id | select_type | table      | partitions | type   | possible_keys       | key                 | key_len | ref      | rows | filtered | Extra                    |
+----+-------------+------------+------------+--------+---------------------+---------------------+---------+----------+------+----------+--------------------------+
|  1 | PRIMARY     | t          | NULL       | ALL    | NULL                | NULL                | NULL    | NULL     |  160 |   100.00 | Using where              |
|  1 | PRIMARY     | <derived3> | NULL       | eq_ref | <auto_distinct_key> | <auto_distinct_key> | 8       | test.t.a |    1 |   100.00 | Using where; Using index |
|  3 | DERIVED     | NULL       | NULL       | NULL   | NULL                | NULL                | NULL    | NULL     | NULL |     NULL | IN-list Converted        |
+----+-------------+------------+------------+--------+---------------------+---------------------+---------+----------+------+----------+--------------------------+
mysql> EXPLAIN format=tree SELECT * FROM t1 WHERE a IN (1,2,3,5,5);
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                                                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Nested loop semijoin
    -> Filter: (t1.a IS NOT NULL)  (cost=0.55 rows=3)
        -> TABLE scan ON t1  (cost=0.55 rows=3)
    -> Filter: (t1.a = tvc_0._col_1)
        -> Index lookup ON tvc_0 using <auto_key0> (_col_1=t1.a)
            -> Materialize
                -> scan ON in-list: 5 rows