Qual é o significado de filtrado no MySQL?

21

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, as linhas mostram o número estimado de linhas examinadas e as linhas × filtradas / 100 mostram o número de linhas que serão unidas às tabelas anteriores. Antes do MySQL 5.7.3, essa coluna é exibida se você usar EXPLAIN EXTENDED. A partir do MySQL 5.7.3, a saída estendida é ativada por padrão e a palavra-chave EXTENDED é desnecessária.

Eu ainda não entendi. Qual é o significado de "filtrado" aqui? Que informações podemos obter desta coluna?

Por exemplo, quando começo a consultar, algumas consultas mostram 100 e outras mostram 18 ou menos 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?

Dizem que a coluna filtrou apenas 18%? Ou, quanto mais baixa a pontuação, mais bom o índice / consulta?

Estou usando o MySQL 5.7

Iman Tumorang
fonte

Respostas:

30

Para filtro aqui significa aplicar uma condição em um conjunto de linhas que foram selecionados por um type-search como linhas potenciais, e só manter as linhas que atendem a condição:

O MySQL primeiro tentará usar um índice, por exemplo, faça uma rangevarredura em sua tabela ausando a searchtecla -key. Ele calcula obter 174 linhas de uso desse índice, que é o número em rows. Esta etapa ainda não é chamada de filtragem.

Depois disso, essas 174 linhas devem ser verificadas em condições adicionais (geralmente na sua wherecláusula). O MySQL agora estima que apenas 32 linhas, portanto 18% dessas 174 linhas, permanecerão após a aplicação do filtro. Estes 18% é o valor em filtered.

Embora seja obviamente melhor ter 32 linhas em vez de 174 (se você precisar posteriormente joincom outra tabela), um índice "perfeito" forneceria essas 32 linhas diretamente a partir da pesquisa inicial, economizando tempo para analisar e filtre 82% de todas as linhas em potencial.

Portanto, um valor baixo pode indicar que poderia haver um índice melhor: por exemplo, uma varredura completa da tabela com rows=1000e filtered=0.1%poderia se tornar uma pesquisa de índice com rows=1e filtered=100%se você adicionar um bom índice.

Por outro lado, você pode muito bem ignorar completamente este filtered-valor (que é na maioria dos casos uma péssima estimativa de qualquer maneira), e foco nas outras colunas mais importantes (especialmente type, keye extra) para otimizar sua consulta. Por exemplo, pode ser melhor se livrar de a filesort(por exemplo, usando um índice que satisfaça a order by), mesmo que resulte em um filteredvalor mais baixo . E um melhor typepode resultar em uma enorme melhoria de desempenho, mesmo que não seja alterada ou até menor filtered. No exemplo acima com filtered=0.1%, type=alljá seria suficiente para indicar que você poderá melhorar essa consulta adicionando um índice, sem olhar filteredpara nada.

Portanto, não leve esse valor muito a sério: nem 100seus índices são bons nem um valor mais baixo indica necessariamente índices ruins. typeé um indicador muito melhor para isso.

Explosão solar
fonte
1
Obrigado pela explicação. Isso explica muito para mim. Eu acho que é útil para manter e selecionando o índice bom
Iman Tumorang
@ImanTumorang Adicionei uma observação e exemplos sobre isso: não leve esse valor muito a sério. Você pode otimizar sua consulta apenas olhando typee extra(que é uma arte por si só); você poderia viver sem filtered, mas não sem type.
Solarflare 15/02
Está bem então. Deixa comigo. Eu já li no Mysql Docs, como eles afetam o desempenho. Obrigado pela sua explicação: D
Iman Tumorang
Outra dica: o cálculo filtrado é ignorado na última tabela unida. isto é, mostrará 100%, mesmo que existam condições que filtrem algumas das linhas examinadas. A lógica é que custa algo para estimar o fator de filtragem, e isso não afetará o plano de execução da consulta se estiver na última tabela; portanto, eles ignoram o cálculo.
Bill Karwin 28/11