Workshop Buscapé    MySQL  WAGNER BONFIGLIO      NAVEGG      Dez/2011
Navegg Maior empresa brasileira de segmentação de audiência online Fundada em 2009, comprada pelo Buscapé em fev/2011 A...
MySQLAgenda Storage Engine Comandos Índices Dicas
MySQL – Storage Engine MyISAM InnoDB BLACKHOLE MEMORY FEDERATED
MySQL – Storage EngineMyISAM                      InnoDB Não suporta transações     Aceita a transações Não suporta FK ...
MySQL – Storage EngineBLACKHOLE Não grava nada na tabela, apenas no Log Binário Aceita transação Não aceita AUTO_INCREM...
MySQL – Storage EngineMEMORY / HEAP Dados ficam apenas em memória e são perdidos em    caso de crash do MySQL   Tabelas ...
MySQL – Storage EngineFEDERATED Link para tabelas em outras máquinas / instânciasCREATE TABLE tabela (       id int(10), ...
MySQL – Comandos INSERT DELAYEDLibera a sessão na hora e deixa o INSERT na fila paraser inserido em lotes HAVINGApós fei...
MySQL – Comandos REPLACEFunciona igual o INSERT, mas caso já exista umalinha com a mesma PK ou UK esta linha é apagada e ...
MySQL – Comandos Tipo de dado SET e ENUMname ENUM(small,medium,large)1 - small, 2 - medium, 3 - largecol SET(a,b)aceita "...
MySQL – Comandos SubquerySELECT * FROM PROFILE WHERE ID IN (SELECTID FROM PROFILESTATUS)SELECT * FROM (SELECT ID, GENDER,...
MySQL – Comandos SubquerySELECT * FROM PROFILE WHERE ID IN (SELECTID FROM PROFILESTATUS)SELECT * FROM (SELECT ID, GENDER,...
MySQL – Comandos SubquerySELECT * FROM PROFILE WHERE ID IN (SELECTID FROM PROFILESTATUS)SELECT * FROM PROFILE p, PROFILES...
MySQL – Comandos SubquerySELECT * FROM PROFILE WHERE ID IN (SELECTID FROM PROFILESTATUS)SELECT * FROM PROFILE p, PROFILES...
MySQL – ComandosEXPLAIN Te diz se a query está usando índice ou não, quantas  linhas foram scaneadas para achar o resulta...
MySQL – ComandosProfiling Mostra quanto demorou uma query e onde esse  tempo foi gasto. Para habilitar "SET profilling=1;"
MySQL - Índice Entenda como o MySQL usa índiceshttp://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html Use o EXPLAIN p...
MySQL - Índice
MySQL - Índice
MySQL - Dicas Pool (disco)   Separar tabelas em databases distintos via código e usar o SO para separá-las em    discos ...
MySQLObrigado!  Wagner Bonfigliobonfiglio@navegg.com
Upcoming SlideShare
Loading in …5
×

MySQL - Wagner Bonfiglio - Navegg

519 views
471 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
519
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

MySQL - Wagner Bonfiglio - Navegg

  1. 1. Workshop Buscapé MySQL WAGNER BONFIGLIO NAVEGG Dez/2011
  2. 2. Navegg Maior empresa brasileira de segmentação de audiência online Fundada em 2009, comprada pelo Buscapé em fev/2011 Analisa mais de 4 bilhões de visitas por mês Mais de 80 milhões de internautas analisados Linguagens C, Python e PHP Bancos de dados MySQL, Redis e MongoDB Ambiente Linux.
  3. 3. MySQLAgenda Storage Engine Comandos Índices Dicas
  4. 4. MySQL – Storage Engine MyISAM InnoDB BLACKHOLE MEMORY FEDERATED
  5. 5. MySQL – Storage EngineMyISAM InnoDB Não suporta transações  Aceita a transações Não suporta FK  Aceita PK Lock a nível de tabelas  Lock a nível de registro Cache de índice  Cache de índice e dados Ruim para escrita  Otimizado para escrita concorrente concorrente Otimizado para leitura  Não é otimizado para muitas leituras
  6. 6. MySQL – Storage EngineBLACKHOLE Não grava nada na tabela, apenas no Log Binário Aceita transação Não aceita AUTO_INCREMENT e DELAYED Usado para:  Log  Enviar dados para servidor de processamento
  7. 7. MySQL – Storage EngineMEMORY / HEAP Dados ficam apenas em memória e são perdidos em caso de crash do MySQL Tabelas devem caber em memória para evitar SWAP (max_heap_table_size) Aceita índice e AUTO_INCREMENT Não aceita TEXT e BLOB Usado como cópia de tabelas muito acessadas, dados perecíveis ou cache
  8. 8. MySQL – Storage EngineFEDERATED Link para tabelas em outras máquinas / instânciasCREATE TABLE tabela ( id int(10), name varchar(100)) ENGINE=FEDERATEDCONNECTION=mysql://user@remote_host:3610/mydatabase/test_table;
  9. 9. MySQL – Comandos INSERT DELAYEDLibera a sessão na hora e deixa o INSERT na fila paraser inserido em lotes HAVINGApós feitos todos os cálculos da query como COUNTou SUM, podemos filtrar apenas resultados "HAVINGCOUNT(col) > 10" ou "HAVING SUM(col) > 100"
  10. 10. MySQL – Comandos REPLACEFunciona igual o INSERT, mas caso já exista umalinha com a mesma PK ou UK esta linha é apagada e anova é colocada em seu lugar (funcionando como umUPDATE)
  11. 11. MySQL – Comandos Tipo de dado SET e ENUMname ENUM(small,medium,large)1 - small, 2 - medium, 3 - largecol SET(a,b)aceita "","a","b","a,b"
  12. 12. MySQL – Comandos SubquerySELECT * FROM PROFILE WHERE ID IN (SELECTID FROM PROFILESTATUS)SELECT * FROM (SELECT ID, GENDER, AGE FROMPROFILE WHERE EDUCATION=3) pro, (SELECTPROFILE, SITE FROM VISIT WHERE DATE=2011-12-06) vis WHERE pro.ID=vis.PROFILE
  13. 13. MySQL – Comandos SubquerySELECT * FROM PROFILE WHERE ID IN (SELECTID FROM PROFILESTATUS)SELECT * FROM (SELECT ID, GENDER, AGE FROMPROFILE WHERE EDUCATION=3) pro, (SELECTPROFILE, SITE FROM VISIT WHERE DATE=2011-12-06) vis WHERE pro.ID=vis.PROFILE
  14. 14. MySQL – Comandos SubquerySELECT * FROM PROFILE WHERE ID IN (SELECTID FROM PROFILESTATUS)SELECT * FROM PROFILE p, PROFILESTATUS s WHERE p.ID=s.IDSELECT * FROM (SELECT ID, GENDER, AGE FROMPROFILE WHERE EDUCATION=3) pro, (SELECTPROFILE, SITE FROM VISIT WHERE DATE=2011-12-06) vis WHERE pro.ID=vis.PROFILE
  15. 15. MySQL – Comandos SubquerySELECT * FROM PROFILE WHERE ID IN (SELECTID FROM PROFILESTATUS)SELECT * FROM PROFILE p, PROFILESTATUS s WHERE p.ID=s.IDSELECT * FROM (SELECT ID, GENDER, AGE FROMPROFILE WHERE EDUCATION=3) pro, (SELECTPROFILE, SITE FROM VISIT WHERE DATE=2011-12-06) vis WHERE pro.ID=vis.PROFILESELECT * FROM PROFILE pro,VISIT vis WHERE pro.ID=vis.PROFILEAND pro.EDUCATION=3 AND vis.DATE=2011-12-06
  16. 16. MySQL – ComandosEXPLAIN Te diz se a query está usando índice ou não, quantas linhas foram scaneadas para achar o resultado, etc
  17. 17. MySQL – ComandosProfiling Mostra quanto demorou uma query e onde esse tempo foi gasto. Para habilitar "SET profilling=1;"
  18. 18. MySQL - Índice Entenda como o MySQL usa índiceshttp://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html Use o EXPLAIN para saber se os seus índices são usados nas suas queries
  19. 19. MySQL - Índice
  20. 20. MySQL - Índice
  21. 21. MySQL - Dicas Pool (disco)  Separar tabelas em databases distintos via código e usar o SO para separá-las em discos diferentes Não usar UPDATE/DELETE  Para evitar muitos UPDATEs e/ou DELETEs é melhor criar uma tabela temporária e dar um truncate no final Amostras  Dependendo o tipo de dados a serem calculados, uma amostra de 1% ou 10% pode ser suficiente (evitar para cálculos que envolvem $$$) Monte seu índice  JOIN com uma coluna de 4 caracteres é mais barato que uma coluna VARCHAR Normalize no Back End mas não ligue para redundância no Front  No Front vale a pena manter os dados prontos para evitar JOIN TUNING + TUNING + TUNING  Entenda as configurações de cache e memória e faça seu tuning! Replicação / Cluster  Cluster no MYSQL não performa bem, já a replicação pode ser uma boa aliada!
  22. 22. MySQLObrigado! Wagner Bonfigliobonfiglio@navegg.com

×