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

Por que essa consulta INNER JOIN/ORDER BY mysql é tão lenta?


(Suponho que você quis digitar ids.customer_id = customer.customer_id e não customer_ids.customer_id)

Sem o ORDER BY, o mysql pegou os primeiros 10 ids do tipo 10 (indexados), procurou o cliente por eles e pronto. (Observe que o LEFT JOIN aqui é realmente um INNER JOIN porque as condições de junção serão válidas apenas para linhas que tenham uma correspondência em ambas as tabelas)

Com o ORDER BY o mysql provavelmente está recuperando todos type=10 clientes, em seguida, classificando-os pelo primeiro nome para encontrar os 10 primeiros.

Você pode acelerar isso desnormalizando a tabela de clientes (copiar o tipo no registro do cliente) ou criando uma tabela de mapeamento para conter o customer_id, name, type tuplas. Em ambos os casos, adicione um índice em (type, name) . Se estiver usando a tabela de mapeamento, use-a para fazer uma junção de três vias com clientes e IDs.

Se type=10 for razoavelmente comum, você também poderá forçar a consulta a percorrer a tabela de clientes pelo nome e verificar o tipo de cada um com STRAIGHT JOIN. Não será tão rápido quanto um índice composto, mas será mais rápido do que puxar todas as partidas.

E como sugerido acima, execute um EXPLAIN em sua consulta para ver o plano de consulta que o mysql está usando.