Sie sind auf Seite 1von 34

Otimizao de Consultas

no MySql
Crcia Felcio

Avaliao do tempo gasto na


execuo de uma expresso

Para avaliar o impacto da execuo de uma funo


especfica no banco de dados

Utilizar a funo benchmark


Informar a quantidade de instrues que sero executadas
e a funo/expresso
Sintaxe: benchmark(qtde_instrucoes,expressao)

Exemplo

SELECT BENCHMARK(1000000,1+1); -- expresso 1+1

SELECT BENCHMARK(1000000,(select
sum(valor_curso) from cursos)) ;
select benchmark(1000000,(select avg(valor_curso)
from cursos));

Avaliao do tempo gasto na


execuo de uma expresso

A funoBENCHMARK()executa a
expressoa quantidade de vezes
informada
Usada para medir a velocidade em que o
mysql executa a expresso

O tempo gasto aparece na frente do campo


duration

O retorno da funo sempre 0


Obs: No usar no servidor de banco de
dados em produo

Como o Mysql processa


uma consulta?

Verifica se a consulta possui uma


sintaxe vlida
Verifica se o usurio que esta
executando a consulta tem privilgios
para execut-la
Verifica se todos os objetos envolvidos
existem
Define um plano de execuo para a
consulta

Como o Mysql processa


uma consulta?

H duas formas de recuperar os


dados da tabela:

Fazendo a leitura de cada linha da


tabela (table scan), e retornando
somente as linhas que satisfazem os
critrios da clusula WHERE
Utilizando um ndice para encontrar
um subconjunto de linhas, e
retornando as linhas que satisfazem
os critrios da clusula WHERE

Plano de execuo

Estratgia do SGBD para recuperar


os dados solicitados pela consulta

Otimizador de consultas

a parte do SGBD responsvel por tomar


decises relacionadas a execuo da
consulta

Otimizador de Consultas
usurio

Bloco SQL simples


Consulta SQL

SQL Parser

Coleo de blocos simples

Transforma em Algebra
Plano cannico
Cria planos alternativos

Otimizador

Planos alternativos
Estima custos

Melhor Plano de execuo

Melhor Plano de execuo

Plano de execuo

Consideraes feitas pelo Otimizador de


Consultas

H alguma outra forma de reescrever a


consulta para que ela possa executar de
maneira mais eficiente?
H indices disponveis para os dados
requeridos pela consulta?
A utilizao desses ndices ir melhorar a
performance? Se sim, quais os indices que
podem ser utilizados?
Se mltiplas tabelas sero processadas, em
qual ordem as tabelas devem ser processadas?

Cache

Cache de dados

Cache de indices

Permite recuperar dados da memria sem


necessidade de fazer o acesso ao disco
Mantm as informaes de indices em
memria, evitando o acesso ao disco

Cache de consultas

Mantm a especificao de algumas


consultas e o resultado delas em memria

Plano de Execuo
explain
select a.*
from alunos a, cursos c
where c.cod_curso=a.cod_curso
and c.nome_curso=Sistemas para Internet;

Plano de Execuo

Id: 1 para a consulta principal, 2 para a primeira


subconsulta, etc
Select_type:

SIMPLE: simples, sem subconsulta ou Union


PRIMARY: select mais externo de uma consulta com
subconsulta
SUBQUERY: PrimeiroSELECTna subconsulta
DEPENDENT SUBQUERY: PrimeiroSELECT, dependente
da subconsulta
UNION: SegundaSELECT, ou select posteriores(quando
h mais de um union)
UNION RESULT: O resultado da operao de unio

Table: Nome da tabela ou alias ao qual a consulta se refere

Plano de Execuo

Type:

ALL: Todas as colunas da tabela da consulta sero lidas

Ocorre quando no h ndices para ser usado ou quando o mysql decide que a
varredura na tabela ter um custo menor que a utilizao de indices

const: Um indice ser usado para recuperar os dados.

Os dados so recuperados atravs de um valor(constante) fornecido na clusula


where, encontrando as linhas que casam com esse valor

eq_ref: Um indice ser usado para recuperar as linhas da tabela que casam com as
linhas fornecidas por um select executado anteriormente

Indica que o indice utilizado uma chave primria ou um campo unique, e que
todas as partes do indice foram utilizadas

Ref: Funciona como o eq_ref exceto pelo fato de:

somente parte do indice pode ser usado ou o indice no um campo unique e


nem chave primria

unique_subquery: Utiliza um indice de pesquisa para satisfazer o resultado


de uma subconsulta

Range: Um indice utilizado para recuperar um intervalo de valores

Ocorre quando h operadores >, <, ou BETWEEN involvidos na consulta

Index: Faz uma varredura de ndice para encontrar as colunas necessrias

ref_or_null: Funciona como o ref exceto pelo fato que a condio tambm inclui
uma busca por valores nulos.

index merge: Ocorre quando o MySQL faz a juno de vrios ndices para chegar no
resultado

Plano de Execuo

Possible_keys: Indices que sero considerados pelo


Mysql na otimizao da consulta
Key: Indice utilizado pelo Mysql ou NULL caso no
utilize indice
Key_len: Mostra o tamanho da coluna ndice

Se mais de uma coluna for usada, o campo poder indicar


somente parte do indice utilizado

Ref: mostra quais colunas ou contantes so usadas


para selecionar registros da tabela
Rows: Indica o nmero de linhas que o mysql estima
que sero processadas para obter o resultado

A estimativa feita para o passo em questo

Plano de Execuo

Extra: Contm informaes adicionais sobre


o passo de execuo

Using Index: Indica que a consulta pode ser


resolvida utilizando somente as informaes dos
ndices
Using where: Uma clusulaWHEREser utilizada
para definir as linhas do resultado
Impossible where: Indica que a condio da
clusula WHERE nunca ser satisfeita
Using join buffer: Utiliza as informaes obtidas
pela juno de tabelas

Analisando consultas

Campo rows

Indica a quantidade de linhas que


foram lidas para gerar o resultado da
consulta

Total de linhas: num_rows1*num_rows2

Exemplo: total de linhas=1*5=5


linhas

Analisando consultas

Mostrar o plano de consulta para a


consulta Listar as informaes
dos alunos que possuem um
codigo de curso vlido

Utilizando subconsulta
Utilizando juno de tabela

Analisando consultas
explain select * from alunos where cod_curso
in(select cod_curso from cursos) ;
explain select a.* from alunos a ,cursos c
where a.cod_curso=c.cod_curso;

Qual a quantidade de linhas acessadas para o


primeiro caso?
Qual a quantidade de linhas acessadas para o
segundo caso?
Qual ter melhor performance?

Analisando Consultas

Analisando consultas

Podemos notar que:

Na consulta utilizando juno o


otimizador de consultas acessou primeiro
a tabela cursos

No respeitou a ordem das tabelas na


consulta
Utilizou o indice nome_curso para realizar a
consulta

Como forar o otimizador a utilizar a ordem


estabelecida na consulta?
Utilizando o termo STRAIGHT_JOIN

Analisando Consultas
Explain
select a.* from alunos a STRAIGHT_JOIN
cursos c where a.cod_curso=c.cod_curso;
O STRAIGHT_JOIN fora o otimizador a
utilizar a ordem estabelecida na consulta
Dessa forma, teremos o mesmo resultado
da consulta com subquery

Somente 12 linhas sero acessadas para gerar


o resultado

Analisando Consultas

Outras possibilidades

USE INDEX

FORCE INDEX

Intrui o MYSQL a utilizar um indice


Fora a utilizao do indice

IGNORE INDEX

Intrui o mysql a ignorar a utilizao do indice

Analisando consultas

Exemplos:

explain
select a.* from alunos a , cursos c Use INDEX(nome_curso_idx)
where c.cod_curso=a.cod_curso
and c.nome_curso='Ciencia da Computacao';
explain
select a.*
from alunos a FORCE INDEX(cod_curso), cursos c
where c.cod_curso=a.cod_curso
and c.nome_curso='Ciencia da Computacao';
explain
select a.*
from alunos a IGNORE INDEX(cod_curso), cursos c
where c.cod_curso=a.cod_curso
and c.nome_curso='Ciencia da Computacao';

Exerccio

Mostrar o plano de execuo da consulta


que lista as informaes dos cursos que
possuem alunos

Utilizando subconsulta
Utilizando juno de tabelas, sendo a tabela
alunos a primeira da clusula from

H diferena entre a quantidade de linhas


acessadas?
Acrescente o STRAIGHT_JOIN para a
consulta com juno
O acrscimo do STRAIGHT_JOIN diminuiu ou
aumenta a quantidade de linhas
acessadas?

Inserindo indices

Considerando que a tabela cursos no


possui indice para o campo nome_curso

Mostrar o plano de execuo para listar as


informaes dos alunos que cursam o curso de
Sistemas para Internet, usando juno de
tabelas

explain
select a.*
from alunos a, cursos c
where c.cod_curso=a.cod_curso
and c.nome_curso=' Sistemas para Internet
';

Inserindo Indices

No caso da consulta anterior, nenhum


campo chave foi utilizado
O acrscimo de um indice no campo
nome, diminuir a quantidade de
linhas acessadas?

Inserindo Indices

Alter table cursos add index


nome_curso_idx(nome_curso);

explain
select a.*
from alunos a, cursos c
where c.cod_curso=a.cod_curso
and c.nome_curso='Sistemas para Internet';

Inserindo Indice

O indice criado pode conter


somente parte do das informaes
do campo (inicio)

Exemplo: Considere que os nomes


dos cursos variam mais nas 4
primeiras letras

Pode ser criado um indice com esses


valores

Alter table cursos add index


nome_curso_idx(nome_curso(4));

Exerccios

Adicione o campo data de nascimento a tabela


alunos
Atualize os valores das datas de nascimento dos
alunos de maneira a ter 50% dos alunos com mais
de 18 anos de idade e 50% com menos de 18
anos
Analise o plano de execuo da consulta listar as
informaes dos alunos com menos de 18 anos

Utilize a funo date_sub(current_date,interval 18 year)


Quantas linhas foram acessadas para gerar o resultado?

Acrescente um indice para o campo data de


nascimento

Exerccios
explain
select * from alunos force
index(dt_nasc_idx) where
date_sub(current_date,interval 18
year)<dt_nasc

Performance de Insert

Inserir dados em uma tabela envolve


as seguintes atividades:

Conexo
Enviar o comando de insero para o
servidor
Analisar o comando
Inserir o registro
Inserir os ndices
Fechar

Performance de Insert

Insero de mltiplas linhas

Insert into cursos(nome_curso,sigla_curso)


values ('Ciencia da Computacao ', 'COMP'),
('Zootecnia ', 'Zoo');
Apresenta melhor performance que os
comandos separados:
Insert into cursos(nome_curso,sigla_curso)
values ('Ciencia da Computacao ', 'COMP');
Insert into cursos(nome_curso,sigla_curso)
('Zootecnia ', 'Zoo');

Performance de Insert
LOCK TABLES cursos alunos WRITE;
Insert into
cursos(nome_curso,sigla_curso)
values ('Decorao', 'DEC');
Insert into
cursos(nome_curso,sigla_curso)
values (Filosofia', 'FILO');

Exerccio

Banco de dados de estados e


cidades

Analisar script de criao do banco de


dados
Fazer anlise do plano de consulta para
a consulta que lista as cidades de
acordo com a UF a qual ela pertence

Mostrar o plano de consulta sem a utilizao


de um ndice
Com utilizao do indice
Usar as opes : Straight_join, Force Index,
Ignore Index

Exerccio

Fazer anlise do plano de consulta para a


consulta que lista as cidades de um estado
de acordo com a letra inicial do nome da
cidade

Mostrar o plano de consulta sem a utilizao de


um ndice
Com utilizao do indice
Usar as opes : Straight_join, Force Index,
Ignore Index

Das könnte Ihnen auch gefallen