Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

consulta complexa leva muito tempo para transferir


Você precisa de um índice composto na tabela de interseção:
ALTER TABLE instruments_tools ADD KEY (id_instrument, id_tool);

A ordem das colunas nesse índice é importante!

O que você espera é que as junções comecem com a tabela de instrumentos e, em seguida, procure a entrada de índice correspondente no índice composto com base em id_instrument. Então, uma vez que encontra essa entrada de índice, ele tem o id_tool relacionado gratuitamente. Portanto, ele não precisa ler a tabela instrument_tools, ele só precisa ler a entrada do índice. Isso deve fornecer o comentário "Usando índice" em seu EXPLAIN para a tabela tools_tools.

Isso deve ajudar, mas você não pode evitar a tabela temporária e a classificação de arquivos, porque as colunas pelas quais você está agrupando e classificando não podem usar um índice.

Você pode tentar fazer com que o MySQL evite escrever a tabela temporária no disco aumentando o tamanho da memória que ele pode usar para tabelas temporárias:
mysql> SET GLOBAL tmp_table_size = 256*1024*1024;      -- 256MB
mysql> SET GLOBAL max_heap_table_size = 256*1024*1024; -- 256MB

Essa figura é apenas um exemplo. Eu não tenho idéia de quão grande teria que ser para a tabela temporária no seu caso.