Atualmente estou verificando o slow_query_log com índices log_queries_not_using habilitados de uma instância mysql. Há uma consulta que aparece com muita frequência, não é uma consulta lenta, mas uma consulta que não usa índices.
A consulta tem a seguinte estrutura:
select ...
from `Tb1`
left join `Tb2` on `Tb1`.`id` = `Tb2`.`id_tb1`
left join `Tb3` on `Tb2`.`id_common` = `Tb3`.`id_common`
left join `Tb4` on `Tb2`.`id` = `Tb4`.`id_tb2`
left join `Tb5` on `Tb1`.`id_tb5` = `Tb5`.`id`;
A explicação para esta consulta é a seguinte:
+----+-------------+--------+------------+--------+-----------------+------------------+---------+-----------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+--------+-----------------+------------------+---------+-----------------------+------+----------+-------------+
| 1 | SIMPLE | Tb1 | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
| 1 | SIMPLE | Tb2 | NULL | ref | fk_tb2_tb1_idx | fk_tb2_tb1_idx | 4 | schema.tb1.id | 1 | 100.00 | NULL |
| 1 | SIMPLE | Tb3 | NULL | ref | fk_tb2_tb3_idx | fk_tb2_tb3_idx | 4 | schema.Tb2.id_common | 1 | 100.00 | Using index |
| 1 | SIMPLE | Tb4 | NULL | ref | fk_tb4_tb2_idx | fk_tb4_tb2_idx | 4 | schema.Tb2.id | 1 | 100.00 | NULL |
| 1 | SIMPLE | Tb5 | NULL | eq_ref | PRIMARY | PRIMARY | 4 | schema.tb1.id_tb5 | 1 | 100.00 | NULL |
+----+-------------+--------+------------+--------+-----------------+------------------+---------+-----------------------+------+----------+-------------+
Como podemos ver na saída da explicação, a consulta não usa nenhum índice em Tb1, embora tenha índices nas colunas nas quais são unidas a outras tabelas.
QUESTÃO 1:
Por que essa consulta não usa o índice na tabela Tb1?
Então, tentei usar um "order by" usando o id de Tb1 assim:
select ...
from `Tb1`
left join `Tb2` on `Tb1`.`id` = `Tb2`.`id_tb1`
left join `Tb3` on `Tb2`.`id_common` = `Tb3`.`id_common`
left join `Tb4` on `Tb2`.`id` = `Tb4`.`id_tb2`
left join `Tb5` on `Tb1`.`id_tb5` = `Tb5`.`id`
order by Tb1.id;
Obtendo o seguinte resultado na explicação:
+----+-------------+--------+------------+--------+-----------------+-------------------+---------+----------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+--------+------------+--------+-----------------+-------------------+---------+----------------------+------+----------+-------------+
| 1 | SIMPLE | Tb1 | NULL | index | NULL | PRIMARY | 4 | NULL | 1 | 100.00 | NULL |
| 1 | SIMPLE | Tb2 | NULL | ref | fk_tb2_tb1_idx | fk_tb2_tb1_idx | 4 | schema.tb1.id | 1 | 100.00 | NULL |
| 1 | SIMPLE | Tb3 | NULL | ref | fk_tb2_tb3_idx | fk_tb2_tb3_idx | 4 | schema.Tb2.id_common | 1 | 100.00 | Using index |
| 1 | SIMPLE | Tb4 | NULL | ref | fk_tb4_tb2_idx | fk_tb4_tb2_idx | 4 | schema.Tb2.id | 1 | 100.00 | NULL |
| 1 | SIMPLE | Tb5 | NULL | eq_ref | PRIMARY | PRIMARY | 4 | schema.tb1.id_tb5 | 1 | 100.00 | NULL |
+----+-------------+--------+------------+--------+-----------------+-------------------+---------+----------------------+------+----------+-------------+
Como podemos ver a partir da saída de explicação no. 2, ele agora usa a chave primária como índice.
QUESTÃO 2:
Usando esta ordem: a) Vai melhorar o desempenho da consulta? b) O desempenho da consulta seria o mesmo. c) Vai degradar o desempenho da consulta?