Vamos falar sobre como o MySQL lida com a classificação

Este artigo foi compartilhado pela Huawei Cloud Community " Como o MySQL lida com a classificação⭐️Como otimizar consultas que precisam ser classificadas?" ", autor: cozinha privada de fundo de Caicai.

Prefácio

Essas duas palavras-chave são frequentemente usadas em consultas MySQL. order by  group by 

O que eles têm em comum é que todos classificam os campos. Então, como é implementada a classificação na instrução de consulta?

Existem duas situações de processamento em que a instrução de consulta usada precisa ser classificada:

  1. Os registros atuais são ordenados inerentemente e não precisam ser classificados.
  2. O registro atual não mantém a ordem e precisa ser classificado

Use índices para garantir a ordem

Para o primeiro caso, a ordenação das colunas do índice no índice secundário é frequentemente usada para garantir a ordenação do conjunto de resultados, de modo que nenhuma classificação seja necessária.

Para a tabela a, crie um índice secundário para a2, então a2 será ordenado no índice secundário.

CRIAR TABELA `a` (
   `a1` int(11) NÃO NULO AUTO_INCREMENT,
   `a2` varchar (255) CONJUNTO DE CARACTERES utf8mb4 PADRÃO NULO,
   `a3` varchar(255) PADRÃO NULO,
   CHAVE PRIMÁRIA (`a1`),
   CHAVE `idx_a2` (`a2`)
 ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8;

select * from a order by a.a2 limit 10

Quando o otimizador opta por usar o índice a2, os registros na coluna a2 são ordenados, portanto não há necessidade de usar outra sobrecarga para classificação.

imagem.png

Claro, o otimizador não pode usar o índice a2 (quando o otimizador achar que usar a2 para retornar a tabela é muito caro, ele usará uma varredura completa da tabela)

imagem.png

Quando a2 estiver fora de ordem no índice usado pelo otimizador, os resultados serão classificados por outros meios.

classificação de arquivos

Quando aparecer a informação extra do plano de execução , o sort_buffer será utilizado para ordenar os resultados. Using filesort 

sort_buffer é um pedaço de memória usado para classificação. sort_buffer pode armazenar todos os campos necessários para a consulta ou apenas os campos e chaves primárias que precisam ser classificados.

show variables like 'max_length_for_sort_data'

Quando o comprimento dos campos exigidos pela consulta for menor que 1 , todos os campos exigidos pela consulta serão colocados em sort_buffer, então as colunas que precisam ser classificadas serão classificadas e, finalmente, os resultados serão retornados. max_length_for_sort_data 

imagem.png

Quando o comprimento do campo necessário para a consulta for maior que o comprimento do campo , apenas os campos e valores de chave primária que precisam ser classificados serão colocados em sort_buffer e, em seguida, o índice clusterizado será consultado para obter o colunas que precisam ser consultadas após a ordenação (equivalente a mais um retorno à tabela) max_length_for_sort_data 

imagem.png

Ao classificar em sort_buffer, se houver memória suficiente, a classificação será feita na memória. Se a memória não for suficiente, o arquivo temporário no disco será usado para auxiliar na classificação.

Ative-o para ver se os arquivos temporários são usados ​​para auxiliar na classificação. optimizer_trace 

#Ativar rastreamento do otimizador
 SET optimizador_trace='enabled=on';
 #sqlstatement
 selecione * no pedido do aluno por nome_do_aluno limite 10000;
 #Veja as informações rastreadas pelo otimizador
 SELECT * FROM `esquema_informação`.`OPTIMIZER_TRACE`\G;

O algoritmo usado para classificação é o algoritmo de mesclagem. Ele é primeiro dividido em vários arquivos pequenos, classificados e depois mesclados.

onde number_of_tmp_files é o número de arquivos temporários usados ​​e sort_buffer_size é o tamanho do sort_buffer

imagem.png

Portanto, ao usar ordenar por, agrupar por e outras palavras-chave que precisam ser classificadas, é melhor estabelecer um índice adequado.

Se a quantidade de dados for pequena, ela poderá ser classificada no buffer de classificação. Se a quantidade de dados for muito grande, ela precisará interagir com o disco.

Resumir

Quando a instrução de consulta precisar ser classificada, ela será dividida em duas situações: sem classificação e necessidade de classificação.

Quando o índice utilizado está em ordem, não há necessidade de ordenação, e a ordem é garantida através do índice.

Quando o índice usado estiver fora de ordem, sort_buffer será usado para classificação. Quando o comprimento do campo de consulta não exceder o limite, cada registro em sort_buffer armazenará a coluna que precisa ser consultada.

Se o limite for excedido, sort_buffer armazenará apenas as colunas e os valores da chave primária que precisam ser classificados. Após a classificação, os valores da chave primária são usados ​​para retornar a tabela para obter as colunas que precisam ser consultadas.

Quando a quantidade de dados for muito grande para ser classificada na memória, páginas do disco serão usadas para auxiliar na classificação e um algoritmo de mesclagem será usado para dispersar os dados classificados em várias páginas e depois mesclá-los.

Você pode analisar o conteúdo por meio do otimizador de rastreamento otimizador_trace para visualizar o número de páginas auxiliares e outras informações.

Crie índices apropriados para colunas que precisam ser classificadas para evitar o uso de classificação assistida por página em disco

O buffer de classificação ou max_length_for_sort_data pode ser ajustado quando a indexação não pode ser usada (com cuidado)

Clique para seguir e conhecer as novas tecnologias da Huawei Cloud o mais rápido possível~

A equipe de IA da Microsoft na China fez as malas e foi para os Estados Unidos, envolvendo centenas de pessoas. Quanta receita um projeto de código aberto desconhecido pode trazer? A Huawei anunciou oficialmente que a posição da Universidade de Ciência e Tecnologia de Yu Chengdong foi ajustada. abriu oficialmente o acesso à rede externa Os fraudadores usaram o TeamViewer para transferir 3,98 milhões! O que os fornecedores de desktop remoto devem fazer? A primeira biblioteca de visualização front-end e fundador do conhecido projeto de código aberto ECharts do Baidu - um ex-funcionário de uma conhecida empresa de código aberto que "foi para o mar" deu a notícia: Depois de ser desafiado por seus subordinados, o técnico O líder ficou furioso e rude e demitiu a funcionária grávida. A OpenAI considerou permitir que a IA gerasse conteúdo pornográfico. A Microsoft relatou à The Rust Foundation doou 1 milhão de dólares americanos. ?
{{o.nome}}
{{m.nome}}

Acho que você gosta

Origin my.oschina.net/u/4526289/blog/11138574
Recomendado
Clasificación