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