Este documento fornece dicas sobre como melhorar o desempenho de consultas no MySQL. Ele explica como usar a ferramenta EXPLAIN para otimizar consultas, como criar tabelas pivot para agregar dados e boas práticas como usar índices e evitar subconsultas desnecessárias.
2. Conteúdo
● EXPLAIN neles!
● MySQL Pivot
● Boas práticas
● Baseado em fatos reais
3. Antes de tudo
CREATE TABLE exams (
pkey int(11) NOT NULL auto_increment,
name varchar(15),
exam int,
score int,
PRIMARY KEY (pkey)
);
e mais alguns inserts..
4. EXPLAIN
● EXPLAIN antes de qualquer consulta, traz as
informações de execução da mesma
● Ótima ferramenta para otimização de consultas
6. ● select_type - mostra o tipo de select utilizado. tipos( SIMPLE,
PRIMARY, etc..
● table - mostra o nome da tabela de onde vem o resultado (para
quando são efetuados JOINs entre tabelas);
● type - tipo de join usado. Do melhor para o pior tipo temos: system,
const, eq_ref, ref, fulltext, range, index, all;
● possible_keys - indica quais os índices que o MySQL pode usar
para encontrar resultados nesta tabela;
● key - índice usado na consulta, ou NULL caso não tenham sido
usados índices;
● key_len - tamanho do índice usado, caso exista;
● ref - coluna(s) usada(s) com a key para devolver resultados;
● rows - número de registos que o MySQL tem de examinar para
executar a consulta;
● extra - informação adicional acerca de como o MySQL vai executar a
consulta. Evite sempre o aparecimento de “using filesort” e “using
temporary“.
7. Um pouco mais complexo
exemplo de explain em uma consulta no database
eadsesipr
8. MySQL Pivot
● Também chamado de Cross-Tabulation
● Agrupamento de vários campos em uma única
linha
● Ideal para relatórios com bastante dados
agregados
10. E se quisessemos agrupar as notas de
cada aluno em apenas uma linha?
11. Pivot neles!
SELECT name
,SUM(IF(exam=1,score,null)) as nota1
,SUM(IF(exam=2,score,null)) as nota2
,SUM(IF(exam=3,score,null)) as nota3
,SUM(IF(exam=4,score,null)) as nota4
FROM exams GROUP BY name
15. ● Não seja guloso. Peça apenas o necessário
(evite SELECT *);
● Os index são seus amigos ( cuidado com os
excessos - indexes malcriados podem deixar a
query mais lenta);
● SEMPRE use o EXPLAIN para dissecar suas
queries e melhorá-las.
● Se puder, evite subconsultas.