Conforme descrito aqui nos documentos do MySQL :
A coluna filtrada indica uma porcentagem estimada de linhas da tabela que serão filtradas pela condição da tabela. Ou seja, linhas mostra o número estimado de linhas examinadas e linhas × filtradas / 100 mostra o número de linhas que serão unidas às tabelas anteriores. Antes do MySQL 5.7.3, esta coluna é exibida se você usar EXPLAIN EXTENDED. A partir do MySQL 5.7.3, a saída estendida é habilitada por padrão e a palavra-chave EXTENDED é desnecessária.
Eu ainda não entendo. Qual é o significado de "filtrado" aqui? Que informações podemos obter desta coluna?
Por exemplo, quando começo a consultar, algumas consultas mostrarão 100 e outras mostrarão 18 ou qualquer coisa menor que 100.
+-------------+-------+--------+---------+---------+------+----------+
| select_type | table | type | key | key_len | rows | filtered |
+-------------+-------+--------+---------+---------+------+----------+
| PRIMARY | a | range | search | 4 | 174 | 18.00 | <--
| PRIMARY | b | eq_ref | PRIMARY | 4 | 1 | 100.00 |
| PRIMARY | c | ALL | PRIMARY | 4 | 1 | 100.00 |
Qual é o ponto principal que podemos concluir desse valor?
Está dizendo que a coluna filtrou apenas 18%? Ou está dizendo que quanto menor a pontuação, melhor o índice ou a consulta?
Estou usando o MySQL 5.7.
Filtrar aqui significa aplicar uma condição em um conjunto de linhas que foram selecionadas por um
type
-search como linhas potenciais e manter apenas as linhas que atendem à condição:O MySQL primeiro tentará usar um índice, por exemplo, fazer uma
range
varredura em sua tabelaa
usando asearch
chave -. Ele estima obter 174 linhas usando esse índice, que é o número emrows
. Esta etapa ainda não é chamada de filtragem.Depois disso, essas 174 linhas devem ser verificadas em relação a condições adicionais (geralmente em sua
where
cláusula). O MySQL agora estimou que apenas 32 linhas, portanto, 18% dessas 174 linhas permanecerão após a aplicação desse filtro. Esses 18% é o valor emfiltered
.Embora seja obviamente melhor ter 32 linhas em vez de 174 (se, por exemplo, você precisar posteriormente
join
com outra tabela), um índice "perfeito" forneceria essas 32 linhas diretamente da pesquisa inicial, economizando tempo para olhar e filtre 82% de todas as linhas potenciais.Portanto, um valor baixo pode indicar que pode haver um índice melhor: por exemplo, uma varredura de tabela completa com
rows=1000
efiltered=0.1%
pode se tornar uma pesquisa de índice comrows=1
efiltered=100%
se você adicionar um bom índice.Por outro lado, você pode ignorar completamente esse
filtered
-valor (que na maioria dos casos é uma estimativa muito ruim de qualquer maneira) e se concentrar nas outras colunas mais importantes (especialmentetype
e )key
paraextra
otimizar sua consulta. Por exemplo, pode ser melhor se livrar de afilesort
(por exemplo, usando um índice que satisfaça oorder by
), mesmo que resulte em umfiltered
valor menor. E um melhortype
pode resultar em uma enorme melhoria de desempenho, mesmo que não mude ou até diminuafiltered
. No exemplo acima comfiltered=0.1%
,type=all
já seria suficiente para indicar que você pode melhorar essa consulta adicionando um índice, sem olharfiltered
para nada.Portanto, não leve esse valor muito a sério: nem
100
significa que seus índices são bons, nem um valor menor necessariamente indica índices ruins.type
é um indicador muito melhor para isso.