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.
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" } } },