Sei sulla pagina 1di 33

Alto desempenho

com banco de dados MySQL


PHP Conference
30/11/2007
Boa tarde!
Jonas Silveira...
Programador PHP Snior
(7 anos de experincia)
Focado em sistemas
corporativos de grande porte
Gerente de Projetos da
Ynpar Tecnologia Ltda.
Gesto de projetos, programao e
administrao de servidores


Contedo da Palestra
Sobre performance...
PHP
- Erros comuns e
- Boas prticas
MySQL
- Projeto Fsico
- Utilizao de ndices
- Tcnicas para ganho de desempenho
- Replicao de dados
Dvidas?
Como obter performance?
Tirando mximo proveito do hardware
Conhecendo os riscos
Conhecendo os gargalos
Reduzindo excessos
Projeto fsico
Projeto fsico: Localizando a lentido
Lentido no servidor de dados
Lentido na comunicao entre
os servidores
Lentido no Servidor WWW

Lentido no servidor WWW
Pouca memria: ocorre muito swap
Processamento insuficiente: muita lentido
Excesso de IO:
- disco muito cheio?
- disco lento ou danificado?
Recursos fsicos limitados na configurao do
PHP ou do Servidor WWW
Aplicao precisa ser otimizada
Lentido na comunicao
Placas de rede lentas ou defeituosas
Switch/Hub imprprio (lento) ou defeituoso
Evitar canal de comunicao via WEB: utilizar
canal exclusivo (outras placas de rede em outro
switch ou vlan)
Demora para conectar no MySQL:
- utilize o IP do servidor e no o nome
- thread de resoluo de nomes pode ser a causa
- usar no my.cnf a opo skip-name-resolve
Lentido no servidor MySQL
Excesso de dados / Hardware inadequado
Projeto fsico inadequado
Utilizao (consultas) inadequada
Erros comuns / Boas prticas:
Contagem de registros
SELECT COUNT(*) FROM...
- Conta o nmero de linhas da consulta;
- Quando a consulta feita em mais de uma
tabela, no h otimizao
COUNT(expr): Conta o nmero de valores
diferentes de null de uma coluna
Boa prtica:
SELECT COUNT(1) FROM...
Erros comuns / Boas prticas:
Contagem de registros
Ao invs da seqncia:
SELECT COUNT(*) FROM...
e depois
SELECT [...] FROM...
LIMIT 0,50
Utilizar:
SELECT sql_calc_found_rows [...] FROM...
LIMIT 0,50
e depois
SELECT found_rows();
Muito bom em casos em que se usa ordenao
Erros comuns / Boas prticas:
Contagem de registros
Evite utilizar uma consulta cheia apenas para
obter o total:
$res = mysql_query(SELECT * FROM ...);
$total = mysql_num_rows($res);
Utilizar sempre funo de contagem:
$res = mysql_query(SELECT COUNT(1) FROM ...);
$total = mysql_result($res, 0);
Erros comuns / Boas prticas:
Transaes demoradas
Tansaes: garantem que os dados foram
gravados no banco ou que nenhum dado foi
gravado
Outros processos podem ficar aguardando
No devem ser demoradas
mysql_query(BEGIN);
#seqencia de cdigo demorada
mysql_query(COMMIT);
Erros comuns / Boas prticas:
Conexes abertas
Feche sempre as conexes quando no precisar
mais delas
Evite abrir duas conexes com o mesmo servidor
As conexes podem atingir limite no banco de
dados e consomem recursos do servidor web
Boa prtica: utilizao de objetos de conexo
utilizando destrutores (POO)

Erros comuns / Boas prticas:
Conexes persistentes
Vantagem em poucos casos
Conexes persistentes so boas se a sobrecarga
(overhead) de criar uma conexo ao seu servidor
SQL for alta
Acaba gerando muitas conexes simultneas
Se um script realizar lock e for finalizado por
um erro, por exemplo, o lock permanece
recomenda-se usar a funo
register_shutdown_function
Erros comuns / Boas prticas:
Variveis de resources
Resource: produto de consultas
Se possvel evitar usar um nome de varivel para
cada resource gerado
Elimine resources grandes se for precisar de
recursos extras do servidor (mysql_free_result)
Boa prtica:
Defina um nome padro (ex: $res) e sobrescreva
os resources se no forem mais utilizados
Isso poupa o servidor e facilita o Debug
Projeto fsico:
Tamanho dos campos
Cada tipo ocupa certo espao em disco
INT(3) ocupa o mesmo espao que INT(11)
Escolher o campo apropriado - ex:
Tipo Signed Unsigned
TINYINT -128 a 127 0 a 255
SMALLINT -32.768 at 32.767 0 at 65.535
MEDIUMINT -8.388.608 at 8.388.607 0 at 16.777.215
INT -2.147.483.648 at 2.147.483.647 0 at 4.294.967.295
Indexao de Campos
Funcionam com ndices de livros
Organizam o acesso aos dados da memria e o
layout dos dados nos discos: consultas mais
rpidas
ndices - Armadilhas
Aumenta o espao utilizado em disco
Inseres/Atualizaes podem ficar lentas
No utilize em campos comumente alterados
Ao realizar vrios inserts, utilize inseres
extendidas
ndices - recomendaes
Crie apenas ndices necessrios
Crie ndices combinados de acordo com o tipo de
e pesquisa que ser realizada
Ex: combinar um campo data com um campo
cliente.
Indexe apenas a quantia necessria de caracteres
Ex: para um campo longo, como nome de uma
pessoa, indexe apenas os 10 primeiros caracteres
ndices - recomendaes
Nas consultas, utilize a maior quantidade de
ndices possveis
O comando EXPLAIN pode ajudar a otimizar
consultas
Consultas aninhadas com
tabelas temporrias
Bom para mesclagem de duas tabelas grandes;
Procedimentos:
- Consulte uma das tabelas e grave o resultado
em uma tabela temporria
- Realize a consulta na outra tabela fazendo
mesclagem com a tabela temporria
CUIDADO com a memria do servidor!
Partio Vertical
Transferncia das colunas (campos)
pouco utilizadas para outra tabela
Ou seja, diviso de uma tabela
em duas, onde em uma ficam os
campos mais utilizados
Busca aos dados mais acessados
mais rpida, pois a tabela
correspondente ficou menor
t
a
b
1
a

t
a
b
1
b

Partio Horizontal
Transferncia de registros para diferentes
tabelas ou bancos de dados
Normalmente transfere-se registros antigos
(histrico) ou remove-os aps backup
Busca aos dados mais rpida, pois a tabela fica
menor, inclusive os arquivos de ndices
Redundncia de dados
Evita consultas complexas, na maioria da vezes
que possuem JOIN, SUM, GROUP BY
Exemplo clssico: pedidos -> pedidos_itens
(deseja-se obter o valor total do pedido somando
o valor dos itens * quantidade)
Fcil implementao utilizando triggers
Dica: criao de histrico
Crie um novo banco de dados, e transfira contedo
antigo para ele (partio horizontal
Se puder, utilize um disco exclusivo (multiple
tablespaces + links simblicos)
Refaa as buscas utilizando UNION ex:
Antes:
SELECT * FROM tabela1;
Depois:
SELECT * FROM tabea1
UNION
SELECT * FROM db_hist.tabela1;
Utilizao de discos exclusivos
Permite concorrncia no acesso aos dados
Bom para criar banco de dados histrico
Bom para armazenar tabelas grandes
Bom para o Log Binrio
Armazene o banco de dados em disco diferente
do Sistema Operacional
Discos: utilize RAID 10
Promove stripping
(diviso) dos dados entre
os arrays
Promove redundncia
dos dados
Servidores de Replicao
Servidores de Replicao
Utilizado para realizao de backups
Pode-se criar um servidor atrasado, por
questes de segurana
Permite escalabilidade: utilize-os para relatrios
Para casos de espelhamento, o servidor no pode
ser lento (inferior ao servidor master)
Se o master falhar, um escravo pode assumir

Servidores de Replicao
Dvidas?
Sites recomendados:
dev.mysql.com/doc/refman/5.0/en/
www.mysqlperformanceblog.com/

Essa apresentao est disponvel em
www.jonas-silveira.com
www.ynpar.com
Consultoria MySQL e outros servios...
Ynpar Tecnologia Ltda. (Alphaville - Barueri/SP)
Servios de Registro de Domnios,
Hospedagem, Software House,
Colocation, Administrao de
Servidores, etc.
Saiba mais em: www.ynpar.com
Contato:
contato@ynpar.com.br
Brasil: 11 4208 7476
USA (Miami): 305 728 6354
Uma empresa do grupo
Total Express
your network partner

Potrebbero piacerti anche