Join vs. Subqueries no MySQL

Trabalhar com bases de dados gigantes nunca é uma tarefa das mais simples. Facilidades de ORM caem por terra, em geral, por questões de desempenho. Jobs diários de migração, integração ou data mining acabam virando uma tarefa demorada e de processamento caro, então fazer tuning de SQL para estes jobs é algo que pode – e deve – ser feito para aumentar a performance.

Dentre as dezenas de tarefas para aumento de performance, estão a ordenação correta das tabelas na hora de fazer as operações de junção. Em geral, joins usando chaves ou campos indexados são mais rápidos que subqueries. Mas para minha surpresa, descobri essa semana que no MySQL isso não é de todo verdade.

A questão é que, usando o comando EXPLAIN EXTENDED e analisando os planos de execução gerados pela engine do MySQL, descobri que o MySQL implementa uma forma interessante de uso de subqueries: quando a quantidade de colunas envolvidas na junção é maior que a quantidade de colunas envolvidas no filtro da subquery, a subquery é mais rápida. O motivo: o MySQL executa esta subquery ANTES das seleções mais externas e mantém o que é possível em cache. Ou seja, exceto os filtros, o arcabouço do resultset que vai ser utilizado como filtro (um in, por exemplo) já está feito, o que resulta em um aumento de performance de no mínimo 50%. Considerando que parte dos filtros pode também sofrer agrupamento, esse ganho pode ser ainda maior. E mais: como seu filtro é mais restritivo logo no começo, o tamanho da sua seleção mais externa tende a ser num universo de dados muito menor. No meu caso, o ganho total foi de mais de 80%.

Portanto, ao fazer SQL Tuning com MySQL, não saia jogando toda e qualquer subquery pra cima e trocando por um Join; talvez o processo contrário seja ainda mais indicado pra você.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s