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

PolarDB:IN述語を結合に変換

最終更新日:Jun 03, 2024

PolarDBは、IN述語から結合への変換をサポートしています。 複雑なクエリの場合、オプティマイザは特定の大きなIN述語を結合に変換します。

前提条件

  • リビジョンバージョンが8.0.2.2.10以降のPolarDB for MySQL 8.0のクラスター。 クラスターバージョンの表示方法については、「エンジンバージョン5.6、5.7、および8.0」をご参照ください。

  • inリストの要素数が、loose_in_predicate_conversion_thresholdパラメーターで指定された数に達しました。

  • [NOT]IN条件は、WHERE句またはON句のトップレベルにあります。

使用法

loose_in_predicate_conversion_thresholdパラメーターを使用して、機能を有効にするかどうかを指定できます。 詳細については、「クラスターパラメーターとノードパラメーターの指定」をご参照ください。

パラメーター

レベル

説明

loose_in_predicate_conversion_threshold

グローバル

機能を有効にするかどうかを指定します。 SQL文のinリストの要素数がこのパラメーターで指定した数に達すると、SQL文のIN述語は結合に変換されます。 値の値: 0 ~ 18446744073709551615 デフォルト値: 5000。

説明

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

元のクエリ:

mysql> EXPLAIN SELECT * FROM (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列、1警告 (0.00秒)
mysql> EXPLAIN format=tree SELECT * FROM (1,2、3,5、5);
+ ------------------------------------------------------------------------------------------------------ +
| EXPLAIN |
+ ------------------------------------------------------------------------------------------------------ +
| -> フィルタ :( t.a IN (1,2、3,5、5)) (コスト=16.25行=80)
    -> テーブルスキャンON t (コスト=16.25行=160)
 |
+ ------------------------------------------------------------------------------------------------------ +
1行セット (0.00秒) 

変換されたクエリ:

mysql> SET in_predicate_conversion_threshold=5;
mysql> EXPLAIN SELECT * FROM (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 | NULL | IN-list変換 |
---- ------------ ----------------------------------------------------------------------------------- --------------------------
mysql> EXPLAIN format=tree SELECT * FROM t1 WHERE a IN (1,2、3,5、5);
+ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
| EXPLAIN |
+ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ +
| -> ネストされたループsemijoin
    -> フィルタ :( t1.aはNULLではありません) (コスト=0.55行=3)
        -> テーブルスキャンON t1 (コスト=0.55行=3)
    -> フィルター :( t1.a = tvc_0._col_1)
        -> <auto_key0> (_col_1=t1.a) を使用してtvc_0でインデックスルックアップ
            -> マテリアライズ
                -> リスト内のスキャン: 5行