Perfil do MySQL na consulta "Criando Índice de Classificação" usando 75% do tempo total

11

Estamos tentando descobrir como otimizar uma consulta (demorando cerca de 100 ms) e executando o perfil que vemos Creating Sort Indexusando 75%o tempo total. Primeiro, o que exatamente afeta a criação do índice de classificação? É disco / io?

Segundo, existe alguma otimização que possamos fazer para a própria consulta?

SELECT r.`id`, 
       r.name, 
       r.public_uri, 
       rv.version, 
       rv.interpreter, 
       rv.notes, 
       rv.content, 
       r.added, 
       r.added_by, 
       r.modified, 
       r.modified_by, 
       r.public, 
       r.public_by
  FROM recipe_heads rh, 
       recipes r, 
       recipe_versions rv
 WHERE rh.recipe = r.`id` 
   AND rh.recipe_version = rv.`id` 
   AND r.`id` = rv.recipe
ORDER BY r.added DESC

Explicar: Captura de tela

Justin
fonte

Respostas:

6

Tivemos um problema semelhante para consultas enormes. Geralmente, as consultas são executadas por horas (até 7-8), dependendo da carga no banco de dados para 400 milhões de linhas. No entanto, nosso objetivo era alcançar resultados de grupo, como col1, col2, col3, contagem (1), contagem (col4 distinta) do grupo de tabelas em 1,2,3.

O problema subjacente é o mesmo que o seu, pois, nos dois casos, o DB classifica (ordena) os resultados internamente.

  • Como a criação de índice de classificação funciona. No site do mysql, diz "O thread está processando um SELECT que é resolvido usando uma tabela temporária interna". Pelo meu entendimento de algoritmo, o sistema provavelmente está dividindo dados em partes, lendo do disco essas partes uma a uma, classificando partes individuais, recolocando algum espaço em disco temporário e assim por diante. O sistema faz isso para todos os pedaços e, eventualmente, executa a classificação de mesclagem. Isso envolve leitura / gravação extensiva.

Uma solução possível pode ser aumentar sua memória para o DB (para que ele possa criar blocos maiores que possam permanecer na memória) ou, se você tiver uma memória maior em outro lugar, poderá programar a solução transmitindo a partir do DB. Isso pode ser alcançado em tempo nlogn.

Programaticamente, eu poderia reduzir o tempo de uma média de 2 horas para 7,5 minutos consistentes.

Chandni
fonte
4

'Criando índice de classificação' é o banco de dados que calcula a ordem dos valores retornados com base na cláusula 'order by'. Os principais limitadores aqui estariam disponíveis CPU / velocidade da CPU e largura de banda da memória. A classificação não será feita até que os dados já estejam todos na memória, pelo menos para uma consulta tão pequena. Se você criar um perfil da consulta, aguarda algum recurso?

Quanto a tornar essa consulta mais rápida, você pode adicionar um índice em 'r.added', pois não parece que exista um de acordo com sua explicação.

Unicorno Marley
fonte
Receitas addedrealmente tem um índice padrão.
Justin Justin