ordem de execução mysql e algoritmo de índice

Palavras-chave usadas na consulta SQL: selecionar, distinto, de, juntar, em, onde, agrupar por, tendo, soma, contagem, máximo, médio, ordem por, limite

1. Ordem de escrita:

selecione->diferente->de->juntar->em->onde->agrupar por->tendo->ordenar por->limite

Campos obrigatórios: selecione, de

Campos opcionais: distinto, juntar, em, onde, agrupar por, tendo, soma, contagem, máximo, médio, ordem por, limite

2. Sequência de execução

from->on->join->where->group by (começar a usar o alias em select, o alias pode ser usado na seguinte instrução) ->sum, count, max, avg->havendo->select->distinct->order by->limit

A ordem de execução aproximada do mysql é a seguinte:

  1. do palco

  2. onde palco

  3. grupo por fase

  4. tendo palco

  5. selecione palco

  6. ordem por etapa

  7. estágio limite

3. Perguntas

Pergunta: Por que os aliases de campo não podem ser usados ​​em where, mas podem ser usados ​​em order by?

Como a ordem de execução de select é posterior, a fase de consulta executada antes dela não pode ser usada. A ordem por estágio está atrás da seleção, portanto, aliases de campo podem ser usados.

Em quarto lugar, o significado das palavras-chave

  • from : Qual tabela de dados precisa recuperar dados (precisa recuperar essa tabela de dados)
  • join : associa as tabelas que precisam ser associadas à consulta (precisa associar esse tipo de tabela de consulta)

Ao executar uma consulta associada, o banco de dados selecionará uma tabela de direcionamento e, em seguida, usará os registros dessa tabela para associar a outras tabelas. Joins à esquerda
geralmente usam a tabela à esquerda como tabela de direcionamento (junções à direita geralmente são a tabela à direita) e junções internas geralmente usam a tabela com menos conjuntos de resultados como tabela de direcionamento. Em alguns casos, a junção à esquerda será otimizada como uma junção interna pelo otimizador de consulta.

Princípio de seleção da tabela de direcionamento: Na premissa de que não tem efeito no conjunto de resultados final, a tabela com o menor conjunto de resultados é preferida como tabela de direcionamento

Nota: Você pode usar o comando Explain para encontrar a tabela do driver, a primeira tabela no resultado é a tabela do driver, mas o plano de execução pode mudar quando for realmente executado

  • em : condição de associação

  • onde : Condições para filtrar dados na tabela

    • Ordem de execução: de baixo para cima, da direita para a esquerda
    • Nota: Tem efeito nos registros do banco de dados, mas não nos resultados da agregação. As condições que podem filtrar o número máximo de registros devem ser escritas no final da cláusula where, e as funções de agregação (sum, count, max, avg) não podem ser usadas
  • agrupar por : como agrupar os dados filtrados acima

    • Ordem de execução: da esquerda para a direita
    • Nota: tente usar where filtrar antes de agrupar, evite usar filtro depois
  • avg : valor médio

  • tendo : Condições para filtrar os dados agrupados acima

    • Observação: filtre os resultados da agregação, por isso é muito intensivo em recursos, você pode usar a função de agregação

    • Exemplo: triagem de áreas com uma população estatística superior a 100 W

      select region, sum(population), sum(area) from bbc group by region tendo sum(population)>1000000, você não pode usar where para filtrar áreas que excedam 100W, porque não existe tal registro

  • select : Ver qual coluna ou resultado de cálculo de uma coluna no conjunto de resultados

  • distinto : desduplica valores duplicados no conjunto de resultados

  • order by : Em que ordem visualizar os dados retornados

    • Ordem de execução: da esquerda para a direita
    • Nota: muito intensivo em recursos
  • limite : interceptar os dados da página de destino

5. Algoritmo usado na associação de índices

  • No caso de junções indexadas , existem dois algoritmos Index Nested-Loop join(junção de loop de aplicação de índice) e Batched Key Access join(junção de acesso de chave em lote)
  • No caso em que a associação de índice não é usadaSimple Nested-Loop join , existem dois algoritmos (junção de loop aninhado simples) e Block Nested-Loop join(junção de loop aninhado de bloco em cache)

Análise de Algoritmos

  • Simple Nested-Loop join(SNLJ, Simple Nested Loop Join) Algoritmo: De acordo com a condição on, busque um pedaço de dados da tabela de controle, então escaneie a tabela inteira para a tabela de controle e coloque os registros qualificados no conjunto de resultados final. Dessa forma, cada registro da tabela de acionamento é acompanhado por uma varredura completa da tabela acionada
    • Número de correspondências: o número de linhas na tabela externa * o número de linhas na tabela interna
  • Index Nested-Loop Join(INLJ, Index Nested Loop Join) Algoritmo: Index Nested Loop Join é um algoritmo de junção baseado em índice. O índice é baseado na tabela interna. A condição de correspondência da tabela externa é correspondida diretamente com o índice da tabela interna, evitando a comparação com cada registro na tabela interna, para que a consulta usando o índice reduza o número de correspondências para a tabela interna.
    • Número de correspondências: o número de linhas na tabela externa * a altura do índice da tabela interna
  • Block Nested-Loop JoinAlgoritmo (BNLJ, junção de loop aninhado de bloco de cache): A junção de loop aninhado de bloco de cache armazena vários dados de uma vez, armazena em cache as colunas que participam da consulta no buffer de junção e, em seguida, compara os dados no buffer de junção com os dados na tabela interna em lotes, reduzindo assim o número de loops internos (os dados da tabela externa no buffer de junção podem ser combinados em lotes uma vez, percorrendo a tabela interna uma vez).
    Quando não estiver em uso Index Nested-Loop Join, use por padrãoBlock Nested-Loop Join
  • Batched Key Access join(BKAJ) Algoritmo: semelhante ao algoritmo SNLJ, mas há um índice disponível na tabela unida. Antes que as linhas sejam enviadas para a tabela unida, as linhas são classificadas de acordo com o campo de índice, reduzindo assim o IO aleatório. A classificação é a maior diferença entre os dois, mas e se a tabela unida não usar um índice? Então use BNLJ

6. O que é Join Buffer?

  • Join BufferTodas as colunas que participam da consulta serão armazenadas em cache em vez de apenas colunas de junção.

  • join_buffer_sizeVocê pode ajustar o tamanho do cache

  • join_buffer_sizeO valor padrão é 256K, join_buffer_sizeo valor máximo MySQL 5.1.22é anterior à versão 4Ge a versão posterior pode ser aplicada a um espaço maior que o 4Gsistema operacional de 64 bits Join Buffer.

  • O uso do algoritmo requer que Block Nested-Loop Joina configuração de gerenciamento do otimizador esteja habilitada , e o padrão é habilitado.optimizer_switchblock_nested_loopon

  • Ao escolher um algoritmo Join, haverá uma prioridade. Em teoria, será priorizado para determinar se INLJ e BNLJ podem ser usados:
    Index Nested-LoopJoin > Block Nested-Loop Join > Simple Nested-Loop Join

Link de referência:

  1. Ordem de execução SQL

  2. Ordem de execução do MySQL

Acho que você gosta

Origin blog.csdn.net/qq_44113347/article/details/131372628
Recomendado
Clasificación