すべてのプロダクト
Search
ドキュメントセンター

PolarDB:IN 述語から JOIN への変換

最終更新日:Aug 28, 2026

PolarDB は、IN 述語から JOIN への変換をサポートしています。前提条件を満たす複雑なクエリに対して、オプティマイザは大きな IN 述語を JOIN に変換し、クエリパフォーマンスを向上させます。

前提条件

  • クラスターは、PolarDB for MySQL 8.0、リビジョンバージョン 8.0.2.2.10 以降を実行している必要があります。詳細については、「バージョン番号の照会」をご参照ください。

  • IN リスト内の要素数が、loose_in_predicate_conversion_threshold パラメーターの値以上である必要があります。

  • [NOT] IN 条件が、WHERE 句または ON 句の最上位レイヤーにある必要があります。

使用方法

loose_in_predicate_conversion_threshold パラメーターを使用して、IN 述語を JOIN に変換する機能を設定できます。詳細については、「クラスターパラメーターとノードパラメーターの設定」をご参照ください。

パラメーター名

レベル

説明

loose_in_predicate_conversion_threshold

グローバル

IN 述語から JOIN への変換機能を制御します。

SQL ステートメントの IN リスト内の要素数がこのパラメーターの値以上である場合、オプティマイザは IN 述語を JOIN に変換します。有効な値:0~18446744073709551615。デフォルト値:5000。

説明

このパラメーターを 0 に設定すると、この機能は無効になります。

例

元のクエリ:

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)

変換後のクエリ:

mysql> SET loose_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 t WHERE a IN (1, 2, 3, 5, 5);
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                                                                                                                    |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Nested loop semijoin
    -> Filter: (t.a IS NOT NULL)  (cost=0.55 rows=3)
        -> TABLE scan ON t  (cost=0.55 rows=3)
    -> Filter: (t.a = tvc_0._col_1)
        -> Index lookup ON tvc_0 using <auto_key0> (_col_1=t.a)
            -> Materialize
                -> scan ON in-list: 5 rows