Alto desempenho  com banco de dados MySQL PHP Conference 30/11/2007
Boa tarde!  Jonas Silveira... <ul><li>Programador PHP Sênior (7 anos de experiência) </li></ul><ul><li>Focado em sistemas ...
Conteúdo da Palestra <ul><li>Sobre performance... </li></ul><ul><li>PHP  - Erros comuns e - Boas práticas </li></ul><ul><l...
Como obter performance? <ul><li>Tirando máximo proveito do hardware </li></ul><ul><li>Conhecendo os riscos </li></ul><ul><...
Projeto físico
Projeto físico: Localizando a lentidão <ul><li>Lentidão no servidor de dados </li></ul><ul><li>Lentidão na comunicação ent...
Lentidão no servidor WWW <ul><li>Pouca memória: ocorre muito swap </li></ul><ul><li>Processamento insuficiente: muita lent...
Lentidão na comunicação <ul><li>Placas de rede lentas ou defeituosas </li></ul><ul><li>Switch/Hub impróprio (lento) ou def...
Lentidão no servidor MySQL <ul><li>Excesso de dados / Hardware inadequado </li></ul><ul><li>Projeto físico inadequado </li...
Erros comuns / Boas práticas: Contagem de registros <ul><li>SELECT COUNT(*) FROM...  - Conta o número de linhas da consult...
Erros comuns / Boas práticas: Contagem de registros <ul><li>Ao invés da seqüência: SELECT COUNT(*) FROM... e depois SELECT...
Erros comuns / Boas práticas: Contagem de registros <ul><li>Evite utilizar uma consulta cheia apenas para obter o total: $...
Erros comuns / Boas práticas: Transações demoradas <ul><li>Tansações: garantem que os dados foram gravados no banco ou que...
Erros comuns / Boas práticas: Conexões abertas <ul><li>Feche sempre as conexões quando não precisar mais delas </li></ul><...
Erros comuns / Boas práticas: Conexões persistentes <ul><li>Vantagem em poucos casos </li></ul><ul><li>Conexões persistent...
Erros comuns / Boas práticas: Variáveis de resources <ul><li>Resource: produto de  consultas </li></ul><ul><li>Se possível...
Projeto físico: Tamanho dos campos <ul><li>Cada tipo ocupa certo espaço em disco </li></ul><ul><li>INT(3) ocupa o mesmo es...
Indexação de Campos <ul><li>Funcionam com índices de livros </li></ul><ul><li>Organizam o acesso aos dados da memória e o ...
Índices - Armadilhas <ul><li>Aumenta o espaço utilizado em disco </li></ul><ul><li>Inserções/Atualizações podem ficar lent...
Índices - recomendações <ul><li>Crie apenas índices necessários </li></ul><ul><li>Crie índices combinados de acordo com o ...
Índices - recomendações <ul><li>Nas consultas, utilize  a maior quantidade de índices possíveis </li></ul><ul><li>O comand...
Consultas aninhadas com  tabelas temporárias <ul><li>Bom para mesclagem de duas tabelas grandes; </li></ul><ul><li>Procedi...
Partição Vertical <ul><li>Transferência das colunas (campos)  pouco utilizadas para outra tabela </li></ul><ul><li>Ou seja...
Partição Horizontal <ul><li>Transferência de registros para diferentes tabelas ou bancos de dados </li></ul><ul><li>Normal...
Redundância de dados <ul><li>Evita consultas complexas, na maioria da vezes que possuem JOIN, SUM, GROUP BY </li></ul><ul>...
Dica: criação de histórico <ul><li>Crie um novo banco de dados, e transfira conteúdo antigo para ele (partição horizontal ...
Utilização de discos exclusivos <ul><li>Permite concorrência no acesso aos dados </li></ul><ul><li>Bom para criar banco de...
Discos: utilize RAID 10 <ul><li>Promove stripping (divisão) dos dados entre os arrays </li></ul><ul><li>Promove redundânci...
Servidores de Replicação
Servidores de Replicação <ul><li>Utilizado para realização de backups </li></ul><ul><li>Pode-se criar um servidor “atrasad...
Servidores de Replicação
Dúvidas? <ul><li>Sites recomendados: dev.mysql.com/doc/refman/5.0/en/ www.mysqlperformanceblog.com/ </li></ul><ul><li>Essa...
Consultoria MySQL e outros serviços... <ul><li>Ynpar Tecnologia Ltda.  (Alphaville  - Barueri/SP) </li></ul><ul><li>Serviç...
Upcoming SlideShare
Loading in …5
×

Alto desempenho com banco de dados MySQL

12,949 views

Published on

Muitas empresas não possuem um DBA, apenas um programador. Quando o volume de dados cresce, o programador acaba sendo bastante penalizado e muitas vezes pode até mesmo perder o emprego. Essa palestra traz dicas valiosas de como otimizar bancos de dados MySQL sem precisar ser um DBA.

Published in: Technology
2 Comments
17 Likes
Statistics
Notes
No Downloads
Views
Total views
12,949
On SlideShare
0
From Embeds
0
Number of Embeds
457
Actions
Shares
0
Downloads
0
Comments
2
Likes
17
Embeds 0
No embeds

No notes for slide

Alto desempenho com banco de dados MySQL

  1. 1. Alto desempenho com banco de dados MySQL PHP Conference 30/11/2007
  2. 2. Boa tarde! Jonas Silveira... <ul><li>Programador PHP Sênior (7 anos de experiência) </li></ul><ul><li>Focado em sistemas corporativos de grande porte </li></ul><ul><li>Gerente de Projetos da Ynpar Tecnologia Ltda. </li></ul><ul><li>Gestão de projetos, programação e administração de servidores </li></ul>
  3. 3. Conteúdo da Palestra <ul><li>Sobre performance... </li></ul><ul><li>PHP - Erros comuns e - Boas práticas </li></ul><ul><li>MySQL - Projeto Físico - Utilização de índices - Técnicas para ganho de desempenho - Replicação de dados </li></ul><ul><li>Dúvidas? </li></ul>
  4. 4. Como obter performance? <ul><li>Tirando máximo proveito do hardware </li></ul><ul><li>Conhecendo os riscos </li></ul><ul><li>Conhecendo os “gargalos” </li></ul><ul><li>Reduzindo excessos </li></ul>
  5. 5. Projeto físico
  6. 6. Projeto físico: Localizando a lentidão <ul><li>Lentidão no servidor de dados </li></ul><ul><li>Lentidão na comunicação entre os servidores </li></ul><ul><li>Lentidão no Servidor WWW </li></ul>
  7. 7. Lentidão no servidor WWW <ul><li>Pouca memória: ocorre muito swap </li></ul><ul><li>Processamento insuficiente: muita lentidão </li></ul><ul><li>Excesso de IO: - disco muito cheio? - disco lento ou danificado? </li></ul><ul><li>Recursos físicos limitados na configuração do PHP ou do Servidor WWW </li></ul><ul><li>Aplicação precisa ser otimizada </li></ul>
  8. 8. Lentidão na comunicação <ul><li>Placas de rede lentas ou defeituosas </li></ul><ul><li>Switch/Hub impróprio (lento) ou defeituoso </li></ul><ul><li>Evitar canal de comunicação via WEB: utilizar canal exclusivo (outras placas de rede em outro switch ou vlan) </li></ul><ul><li>Demora para conectar no MySQL: - utilize o IP do servidor e não o nome - thread de resolução de nomes pode ser a causa - usar no my.cnf a opção “skip-name-resolve” </li></ul>
  9. 9. Lentidão no servidor MySQL <ul><li>Excesso de dados / Hardware inadequado </li></ul><ul><li>Projeto físico inadequado </li></ul><ul><li>Utilização (consultas) inadequada </li></ul>
  10. 10. Erros comuns / Boas práticas: Contagem de registros <ul><li>SELECT COUNT(*) FROM... - Conta o número de linhas da consulta; - Quando a consulta é feita em mais de uma tabela, não há otimização </li></ul><ul><li>COUNT( expr ): Conta o número de valores diferentes de null de uma coluna </li></ul><ul><li>Boa prática: SELECT COUNT(1) FROM... </li></ul>
  11. 11. Erros comuns / Boas práticas: Contagem de registros <ul><li>Ao invés da seqüência: SELECT COUNT(*) FROM... e depois SELECT [...] FROM... LIMIT 0,50 </li></ul><ul><li>Utilizar: SELECT sql_calc_found_rows [...] FROM... LIMIT 0,50 e depois SELECT found_rows (); </li></ul><ul><li>Muito bom em casos em que se usa ordenação </li></ul>
  12. 12. Erros comuns / Boas práticas: Contagem de registros <ul><li>Evite utilizar uma consulta cheia apenas para obter o total: $res = mysql_query(‘SELECT * FROM ...’); $total = mysql_num_rows($res); </li></ul><ul><li>Utilizar sempre função de contagem: $res = mysql_query(‘SELECT COUNT(1) FROM ...’); $total = mysql_result($res, 0); </li></ul>
  13. 13. Erros comuns / Boas práticas: Transações demoradas <ul><li>Tansações: garantem que os dados foram gravados no banco ou que nenhum dado foi gravado </li></ul><ul><li>Outros processos podem ficar aguardando </li></ul><ul><li>Não devem ser demoradas mysql_query(“BEGIN”); # seqüencia de código demorada mysql_query(“COMMIT”); </li></ul>
  14. 14. Erros comuns / Boas práticas: Conexões abertas <ul><li>Feche sempre as conexões quando não precisar mais delas </li></ul><ul><li>Evite abrir duas conexões com o mesmo servidor </li></ul><ul><li>As conexões podem atingir limite no banco de dados e consomem recursos do servidor web </li></ul><ul><li>Boa prática: utilização de “objetos” de conexão utilizando destrutores (POO) </li></ul>
  15. 15. Erros comuns / Boas práticas: Conexões persistentes <ul><li>Vantagem em poucos casos </li></ul><ul><li>Conexões persistentes são boas se a sobrecarga (overhead) de criar uma conexão ao seu servidor SQL for alta </li></ul><ul><li>Acaba gerando muitas conexões simultâneas </li></ul><ul><li>Se um script realizar “lock” e for finalizado por um erro, por exemplo, o “lock” permanece – recomenda-se usar a função “register_shutdown_function” </li></ul>
  16. 16. Erros comuns / Boas práticas: Variáveis de resources <ul><li>Resource: produto de consultas </li></ul><ul><li>Se possível evitar usar um nome de variável para cada resource gerado </li></ul><ul><li>Elimine resources grandes se for precisar de recursos extras do servidor (mysql_free_result) </li></ul><ul><li>Boa prática: Defina um nome padrão (ex: $res) e sobrescreva os resources se não forem mais utilizados Isso poupa o servidor e facilita o Debug </li></ul>
  17. 17. Projeto físico: Tamanho dos campos <ul><li>Cada tipo ocupa certo espaço em disco </li></ul><ul><li>INT(3) ocupa o mesmo espaço que INT(11) </li></ul><ul><li>Escolher o campo apropriado - ex: </li></ul>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
  18. 18. Indexação de Campos <ul><li>Funcionam com índices de livros </li></ul><ul><li>Organizam o acesso aos dados da memória e o layout dos dados nos discos: consultas mais rápidas </li></ul>
  19. 19. Índices - Armadilhas <ul><li>Aumenta o espaço utilizado em disco </li></ul><ul><li>Inserções/Atualizações podem ficar lentas </li></ul><ul><li>Não utilize em campos comumente alterados </li></ul><ul><li>Ao realizar vários inserts, utilize inserções extendidas </li></ul>
  20. 20. Índices - recomendações <ul><li>Crie apenas índices necessários </li></ul><ul><li>Crie índices combinados de acordo com o tipo de e pesquisa que será realizada Ex: combinar um campo “data” com um campo “cliente”. </li></ul><ul><li>Indexe apenas a quantia necessária de caracteres Ex: para um campo longo, como “nome” de uma pessoa, indexe apenas os 10 primeiros caracteres </li></ul>
  21. 21. Índices - recomendações <ul><li>Nas consultas, utilize a maior quantidade de índices possíveis </li></ul><ul><li>O comando “EXPLAIN” pode ajudar a otimizar consultas </li></ul>
  22. 22. Consultas aninhadas com tabelas temporárias <ul><li>Bom para mesclagem de duas tabelas grandes; </li></ul><ul><li>Procedimentos: - Consulte uma das tabelas e grave o resultado em uma tabela temporária - Realize a consulta na outra tabela fazendo mesclagem com a tabela temporária </li></ul><ul><li>CUIDADO com a memória do servidor! </li></ul>
  23. 23. Partição Vertical <ul><li>Transferência das colunas (campos) pouco utilizadas para outra tabela </li></ul><ul><li>Ou seja, divisão de uma tabela em duas, onde em uma ficam os campos mais utilizados </li></ul><ul><li>Busca aos dados mais acessados mais rápida, pois a tabela correspondente ficou menor </li></ul>tab1a tab1b
  24. 24. Partição Horizontal <ul><li>Transferência de registros para diferentes tabelas ou bancos de dados </li></ul><ul><li>Normalmente transfere-se registros antigos (histórico) ou remove-os após backup </li></ul><ul><li>Busca aos dados mais rápida, pois a tabela fica menor, inclusive os arquivos de índices </li></ul>
  25. 25. Redundância de dados <ul><li>Evita consultas complexas, na maioria da vezes que possuem JOIN, SUM, GROUP BY </li></ul><ul><li>Exemplo clássico: pedidos -> pedidos_itens (deseja-se obter o valor total do pedido somando o valor dos itens * quantidade) </li></ul><ul><li>Fácil implementação utilizando triggers </li></ul>
  26. 26. Dica: criação de histórico <ul><li>Crie um novo banco de dados, e transfira conteúdo antigo para ele (partição horizontal </li></ul><ul><li>Se puder, utilize um disco exclusivo (“ multiple tablespaces ” + links simbólicos) </li></ul><ul><li>Refaça as buscas utilizando UNION – ex: Antes: SELECT * FROM tabela1; Depois: SELECT * FROM tabea1 UNION SELECT * FROM db_hist.tabela1; </li></ul>
  27. 27. Utilização de discos exclusivos <ul><li>Permite concorrência no acesso aos dados </li></ul><ul><li>Bom para criar banco de dados histórico </li></ul><ul><li>Bom para armazenar tabelas grandes </li></ul><ul><li>Bom para o Log Binário </li></ul><ul><li>Armazene o banco de dados em disco diferente do Sistema Operacional </li></ul>
  28. 28. Discos: utilize RAID 10 <ul><li>Promove stripping (divisão) dos dados entre os arrays </li></ul><ul><li>Promove redundância dos dados </li></ul>
  29. 29. Servidores de Replicação
  30. 30. Servidores de Replicação <ul><li>Utilizado para realização de backups </li></ul><ul><li>Pode-se criar um servidor “atrasado”, por questões de segurança </li></ul><ul><li>Permite escalabilidade: utilize-os para relatórios </li></ul><ul><li>Para casos de espelhamento, o servidor não pode ser lento (inferior ao servidor master) </li></ul><ul><li>Se o “master” falhar, um escravo pode assumir </li></ul>
  31. 31. Servidores de Replicação
  32. 32. Dúvidas? <ul><li>Sites recomendados: dev.mysql.com/doc/refman/5.0/en/ www.mysqlperformanceblog.com/ </li></ul><ul><li>Essa apresentação está disponível em www.jonas-silveira.com www.ynpar.com </li></ul>
  33. 33. Consultoria MySQL e outros serviços... <ul><li>Ynpar Tecnologia Ltda. (Alphaville - Barueri/SP) </li></ul><ul><li>Serviços de Registro de Domínios, Hospedagem, Software House, Colocation, Administração de Servidores, etc. </li></ul><ul><li>Saiba mais em: www.ynpar.com </li></ul><ul><li>Contato: contato@ynpar.com.br Brasil: 11 4208 7476 USA (Miami): 305 728 6354 </li></ul>Uma empresa do grupo Total Express your network partner

×