Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Atualizado em 2024-09-29 GMT+08:00

Uso

Você pode usar o parâmetro rds_in_predicate_conversion_threshold para converter predicados IN em subconsultas.

O valor padrão é 0, indicando que a conversão está desativada. Para configurar esse parâmetro, entre em contato com o atendimento ao cliente.

Tabela 1 Descrição do parâmetro

Parâmetro

Nível

Descrição

rds_in_predicate_conversion_threshold

Global

Controla o número mínimo de elementos na lista de valores de um predicado IN que aciona sua conversão em uma subconsulta IN.

Exemplo:

  • Consulta antes da conversão:
    mysql> explain select * from t where a in (1,2,3,4,5);
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
    | id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
    +----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+-------------+
    |  1 | SIMPLE      | t     | NULL       | ALL  | idx1          | NULL | NULL    | NULL |    5 |   100.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,4,5);
    +-------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                         |
    +-------------------------------------------------------------------------------------------------+
    | -> Filter: (t.a in (1,2,3,4,5))  (cost=0.75 rows=5)
        -> Table scan on t  (cost=0.75 rows=5)
     |
    +-------------------------------------------------------------------------------------------------+
    1 row in set (0.01 sec)

  • Consulta após a conversão:
    mysql> set rds_in_predicate_conversion_threshold=3;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> explain select * from t where a in (1,2,3,4,5);
    +----+-------------+------------------+------------+--------+---------------------+---------------------+---------+----------+------+----------+-------------------+
    | id | select_type | table            | partitions | type   | possible_keys       | key                 | key_len | ref      | rows | filtered | Extra             |
    +----+-------------+------------------+------------+--------+---------------------+---------------------+---------+----------+------+----------+-------------------+
    |  1 | SIMPLE      | t                | NULL       | ALL    | idx1                | NULL                | NULL    | NULL     |    5 |   100.00 | Using where       |
    |  1 | SIMPLE      | <in_predicate_2> | NULL       | eq_ref | <auto_distinct_key> | <auto_distinct_key> | 5       | test.t.a |    1 |   100.00 | IN-list converted |
    +----+-------------+------------------+------------+--------+---------------------+---------------------+---------+----------+------+----------+-------------------+
    2 rows in set, 1 warning (0.00 sec)
    
    mysql> explain format=tree select * from t where a in (1,2,3,4,5);
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | EXPLAIN                                                                                                                                                                                                                                                     |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | -> Nested loop inner join  (cost=2.50 rows=5)
        -> Filter: (t.a is not null)  (cost=0.75 rows=5)
            -> Table scan on t  (cost=0.75 rows=5)
        -> Single-row index lookup on <in_predicate_2> using <auto_distinct_key> (a=t.a)  (cost=0.27 rows=1)
     |
    +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

    EXPLAIN retorna o plano de execução. Há <in_predicate_*> (* indica um número) na coluna da tabela. Isso significa que a tabela é uma tabela temporária que armazena todos os dados na consulta IN.

    Você também pode exibir informações in_to_subquery_conversion no rastreamento otimizado.

    | explain format=tree select * from t where a in (1,2,3,4,5) | {
      "steps": [
        {
          "join_preparation": {
            "select#": 1,
            "steps": [
              {
                "IN_uses_bisection": true
              },
              {
                "in_to_subquery_conversion": {
                  "item": "(`t`.`a` in (1,2,3,4,5))",
                  "steps": [
                    {
                      "creating_tmp_table": {
                        "tmp_table_info": {
                          "table": "intermediate_tmp_table",
                          "columns": 1,
                          "row_length": 5,
                          "key_length": 5,
                          "unique_constraint": false,
                          "makes_grouped_rows": false,
                          "cannot_insert_duplicates": true,
                          "location": "TempTable"
                        }
                      }
                    },