全部产品
Search
文档中心

PolarDB:Konversi predikat IN menjadi join

更新时间:Jul 03, 2025

PolarDB mendukung konversi predikat IN menjadi join. Untuk query kompleks, pengoptimal mengonversi beberapa predikat IN besar menjadi join.

Prasyarat

  • Kluster PolarDB for MySQL 8.0 dengan versi revisi 8.0.2.2.10 atau lebih baru. Untuk informasi tentang cara memeriksa versi kluster, lihat Versi mesin 5.6, 5.7, dan 8.0.

  • Jumlah elemen dalam daftar IN mencapai angka yang ditentukan dalam parameter loose_in_predicate_conversion_threshold.

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

Penggunaan

Gunakan parameter loose_in_predicate_conversion_threshold untuk menentukan apakah fitur ini diaktifkan. Untuk informasi lebih lanjut, lihat Tentukan parameter kluster dan node.

Parameter

Tingkat

Deskripsi

loose_in_predicate_conversion_threshold

Global

Menentukan apakah akan mengaktifkan fitur ini. Jika jumlah elemen dalam daftar IN dari pernyataan SQL mencapai angka yang ditentukan dalam parameter ini, predikat IN dalam pernyataan SQL dikonversi menjadi join. Nilai valid: 0 hingga 18446744073709551615. Nilai default: 5000.

Catatan

Jika parameter ini disetel ke 0, fitur ini dinonaktifkan.

Contoh

Query 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)

Query yang dikonversi:

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