SlideShare une entreprise Scribd logo
1  sur  22
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
 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.
MySQL

Agenda

 Storage Engine
 Comandos
 Índices
 Dicas
MySQL – Storage Engine

 MyISAM
 InnoDB
 BLACKHOLE
 MEMORY
 FEDERATED
MySQL – Storage Engine

MyISAM                      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
MySQL – Storage Engine

BLACKHOLE

 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
MySQL – Storage Engine

MEMORY / 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
MySQL – Storage Engine

FEDERATED

 Link para tabelas em outras máquinas / instâncias


CREATE TABLE tabela (
       id int(10), name varchar(100)
) ENGINE=FEDERATED
CONNECTION='mysql://user@remote_host:3610/
mydatabase/test_table';
MySQL – Comandos

 INSERT DELAYED
Libera a sessão na hora e deixa o INSERT na fila para
ser inserido em lotes

 HAVING
Após feitos todos os cálculos da query como COUNT
ou SUM, podemos filtrar apenas resultados "HAVING
COUNT(col) > 10" ou "HAVING SUM(col) > 100"
MySQL – Comandos

 REPLACE
Funciona igual o INSERT, mas caso já exista uma
linha com a mesma PK ou UK esta linha é apagada e a
nova é colocada em seu lugar (funcionando como um
UPDATE)
MySQL – Comandos

 Tipo de dado SET e ENUM


name ENUM('small','medium','large')
1 - small, 2 - medium, 3 - large

col SET('a','b')
aceita "","a","b","a,b"
MySQL – Comandos

 Subquery


SELECT * FROM PROFILE WHERE ID IN (SELECT
ID FROM PROFILESTATUS)

SELECT * FROM (SELECT ID, GENDER, AGE FROM
PROFILE WHERE EDUCATION=3) pro, (SELECT
PROFILE, SITE FROM VISIT WHERE DATE='2011-
12-06') vis WHERE pro.ID=vis.PROFILE
MySQL – Comandos

 Subquery


SELECT * FROM PROFILE WHERE ID IN (SELECT
ID FROM PROFILESTATUS)

SELECT * FROM (SELECT ID, GENDER, AGE FROM
PROFILE WHERE EDUCATION=3) pro, (SELECT
PROFILE, SITE FROM VISIT WHERE DATE='2011-
12-06') vis WHERE pro.ID=vis.PROFILE
MySQL – Comandos

 Subquery


SELECT * FROM PROFILE WHERE ID IN (SELECT
ID FROM PROFILESTATUS)
SELECT * FROM PROFILE p, PROFILESTATUS s WHERE p.ID=s.ID

SELECT * FROM (SELECT ID, GENDER, AGE FROM
PROFILE WHERE EDUCATION=3) pro, (SELECT
PROFILE, SITE FROM VISIT WHERE DATE='2011-
12-06') vis WHERE pro.ID=vis.PROFILE
MySQL – Comandos

 Subquery


SELECT * FROM PROFILE WHERE ID IN (SELECT
ID FROM PROFILESTATUS)
SELECT * FROM PROFILE p, PROFILESTATUS s WHERE p.ID=s.ID

SELECT * FROM (SELECT ID, GENDER, AGE FROM
PROFILE WHERE EDUCATION=3) pro, (SELECT
PROFILE, SITE FROM VISIT WHERE DATE='2011-
12-06') vis WHERE pro.ID=vis.PROFILE
SELECT * FROM PROFILE pro,VISIT vis WHERE pro.ID=vis.PROFILE
AND pro.EDUCATION=3 AND vis.DATE='2011-12-06'
MySQL – Comandos

EXPLAIN
 Te diz se a query está usando índice ou não, quantas
  linhas foram scaneadas para achar o resultado, etc
MySQL – Comandos

Profiling
 Mostra quanto demorou uma query e onde esse
  tempo foi gasto. Para habilitar "SET profilling=1;"
MySQL - Índice

 Entenda como o MySQL usa índices
http://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
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 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!
MySQL




Obrigado!

  Wagner Bonfiglio
bonfiglio@navegg.com

Contenu connexe

Tendances

LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)
Carlos Santos
 

Tendances (10)

Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8Fundamentos de SQL - Parte 1 de 8
Fundamentos de SQL - Parte 1 de 8
 
Fundamentos de SQL - Parte 3 de 8
Fundamentos de SQL - Parte 3 de 8Fundamentos de SQL - Parte 3 de 8
Fundamentos de SQL - Parte 3 de 8
 
Fundamentos SQL - Microsoft SQL Server 2019 - Parte 1/8
Fundamentos SQL - Microsoft SQL Server 2019 - Parte 1/8Fundamentos SQL - Microsoft SQL Server 2019 - Parte 1/8
Fundamentos SQL - Microsoft SQL Server 2019 - Parte 1/8
 
Fundamentos de SQL - Parte 6 de 8
Fundamentos de SQL - Parte 6 de 8Fundamentos de SQL - Parte 6 de 8
Fundamentos de SQL - Parte 6 de 8
 
UNIFAL - MySQL Views - 5.0/5.6
UNIFAL - MySQL Views - 5.0/5.6UNIFAL - MySQL Views - 5.0/5.6
UNIFAL - MySQL Views - 5.0/5.6
 
Fundamentos de SQL - Parte 5 de 8
Fundamentos de SQL - Parte 5 de 8Fundamentos de SQL - Parte 5 de 8
Fundamentos de SQL - Parte 5 de 8
 
Fundamentos de SQL - Parte 4 de 8
Fundamentos de SQL - Parte 4 de 8Fundamentos de SQL - Parte 4 de 8
Fundamentos de SQL - Parte 4 de 8
 
LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)
 
Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7
 
Apresentação Oracle SGBD
Apresentação Oracle SGBDApresentação Oracle SGBD
Apresentação Oracle SGBD
 

En vedette

Banco de Dados MySQL
Banco de Dados MySQLBanco de Dados MySQL
Banco de Dados MySQL
Marcus Couto
 

En vedette (20)

Aula 08 meios de comunicação de dados
Aula 08 meios de comunicação de dadosAula 08 meios de comunicação de dados
Aula 08 meios de comunicação de dados
 
Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1
 
Projeto de Banco de Dados - Capítulo 1
Projeto de Banco de Dados - Capítulo 1Projeto de Banco de Dados - Capítulo 1
Projeto de Banco de Dados - Capítulo 1
 
Banco de Dados MySQL
Banco de Dados MySQLBanco de Dados MySQL
Banco de Dados MySQL
 
Comandos DDL para o MySQL
Comandos DDL para o MySQLComandos DDL para o MySQL
Comandos DDL para o MySQL
 
Aula 05 instalação de hardware
Aula 05 instalação de hardwareAula 05 instalação de hardware
Aula 05 instalação de hardware
 
Aula 03 instalação de hardware
Aula 03 instalação de hardwareAula 03 instalação de hardware
Aula 03 instalação de hardware
 
Psi-mod-15
Psi-mod-15Psi-mod-15
Psi-mod-15
 
CONEXÃO BANCO DE DADOS MYSQL COM JAVA
CONEXÃO BANCO DE DADOS MYSQL  COM JAVACONEXÃO BANCO DE DADOS MYSQL  COM JAVA
CONEXÃO BANCO DE DADOS MYSQL COM JAVA
 
Aula 06 instalação de hardware
Aula 06 instalação de hardwareAula 06 instalação de hardware
Aula 06 instalação de hardware
 
Aula 04 instalação de hardware
Aula 04 instalação de hardwareAula 04 instalação de hardware
Aula 04 instalação de hardware
 
Aula 07 instalação de hardware
Aula 07 instalação de hardwareAula 07 instalação de hardware
Aula 07 instalação de hardware
 
Aula 12 instalação de hardware
Aula 12 instalação de hardwareAula 12 instalação de hardware
Aula 12 instalação de hardware
 
Aula 09 instalação de hardware
Aula 09 instalação de hardwareAula 09 instalação de hardware
Aula 09 instalação de hardware
 
Aula 12 banco de dados
Aula 12   banco de dadosAula 12   banco de dados
Aula 12 banco de dados
 
Aula 10 banco de dados
Aula 10   banco de dadosAula 10   banco de dados
Aula 10 banco de dados
 
MODELOS DE DADOS - Parte 2 Sistemas de Informação
MODELOS DE DADOS - Parte 2 Sistemas de InformaçãoMODELOS DE DADOS - Parte 2 Sistemas de Informação
MODELOS DE DADOS - Parte 2 Sistemas de Informação
 
Conceitos e arquitetura do sistema de banco de dados
Conceitos e arquitetura do sistema de banco de dadosConceitos e arquitetura do sistema de banco de dados
Conceitos e arquitetura do sistema de banco de dados
 
Aula 11 instalação de hardware
Aula 11 instalação de hardwareAula 11 instalação de hardware
Aula 11 instalação de hardware
 
Arquitetura e sgbd de um banco de dados
Arquitetura e sgbd de um banco de dadosArquitetura e sgbd de um banco de dados
Arquitetura e sgbd de um banco de dados
 

Similaire à MySQL - Workshop Buscapé

Php curso de php com my sql
Php   curso de php com my sqlPhp   curso de php com my sql
Php curso de php com my sql
robinhoct
 
3260 php truquesmagicos %281%29
3260 php truquesmagicos %281%293260 php truquesmagicos %281%29
3260 php truquesmagicos %281%29
Juliana Nascimento
 
Apostila Curso Php My Sql(Portugues)
Apostila Curso Php My Sql(Portugues)Apostila Curso Php My Sql(Portugues)
Apostila Curso Php My Sql(Portugues)
guestcc491
 

Similaire à MySQL - Workshop Buscapé (20)

Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016Otimizando a performance com in memory no sql 2016
Otimizando a performance com in memory no sql 2016
 
Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day Workshop
 
Php curso de php com my sql
Php   curso de php com my sqlPhp   curso de php com my sql
Php curso de php com my sql
 
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
UNIFAL - MySQL Linguagem SQL Básico - 5.0/5.6
 
3260 php truquesmagicos %281%29
3260 php truquesmagicos %281%293260 php truquesmagicos %281%29
3260 php truquesmagicos %281%29
 
3260 php truquesmagicos
3260 php truquesmagicos3260 php truquesmagicos
3260 php truquesmagicos
 
MySQL - Instalação e Alguns comandos de Banco de Dados
MySQL - Instalação e Alguns comandos de Banco de DadosMySQL - Instalação e Alguns comandos de Banco de Dados
MySQL - Instalação e Alguns comandos de Banco de Dados
 
Prog web 05-php-mysql
Prog web 05-php-mysqlProg web 05-php-mysql
Prog web 05-php-mysql
 
Mais performance com o MySQL 5.6
Mais performance com o MySQL 5.6Mais performance com o MySQL 5.6
Mais performance com o MySQL 5.6
 
Db2
Db2Db2
Db2
 
Apostila Curso Php My Sql(Portugues)
Apostila Curso Php My Sql(Portugues)Apostila Curso Php My Sql(Portugues)
Apostila Curso Php My Sql(Portugues)
 
Palestra MongoDB
Palestra MongoDBPalestra MongoDB
Palestra MongoDB
 
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
PHP Conference 2014: Uma string em dez milhões de documentos em menos de um s...
 
Oracle 11g resumo
Oracle 11g resumoOracle 11g resumo
Oracle 11g resumo
 
Dojo banco de dados
Dojo   banco de dadosDojo   banco de dados
Dojo banco de dados
 
Bad Smells em Bancos de Dados
Bad Smells em Bancos de DadosBad Smells em Bancos de Dados
Bad Smells em Bancos de Dados
 
Postgres Big data
Postgres Big dataPostgres Big data
Postgres Big data
 
Novidades do Sql Server 2016
Novidades do Sql Server 2016Novidades do Sql Server 2016
Novidades do Sql Server 2016
 
Modulo 15 PSI
Modulo 15 PSIModulo 15 PSI
Modulo 15 PSI
 
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
Dsi   015 - poo e php - conexão com bancos de dados usando pdoDsi   015 - poo e php - conexão com bancos de dados usando pdo
Dsi 015 - poo e php - conexão com bancos de dados usando pdo
 

Dernier

Dernier (6)

ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docxATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
ATIVIDADE 1 - ESTRUTURA DE DADOS II - 52_2024.docx
 
Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 

MySQL - Workshop Buscapé

  • 1. Workshop Buscapé MySQL WAGNER BONFIGLIO NAVEGG Dez/2011
  • 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. MySQL Agenda  Storage Engine  Comandos  Índices  Dicas
  • 4. MySQL – Storage Engine  MyISAM  InnoDB  BLACKHOLE  MEMORY  FEDERATED
  • 5. MySQL – Storage Engine MyISAM 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. MySQL – Storage Engine BLACKHOLE  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. MySQL – Storage Engine MEMORY / 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. MySQL – Storage Engine FEDERATED  Link para tabelas em outras máquinas / instâncias CREATE TABLE tabela ( id int(10), name varchar(100) ) ENGINE=FEDERATED CONNECTION='mysql://user@remote_host:3610/ mydatabase/test_table';
  • 9. MySQL – Comandos  INSERT DELAYED Libera a sessão na hora e deixa o INSERT na fila para ser inserido em lotes  HAVING Após feitos todos os cálculos da query como COUNT ou SUM, podemos filtrar apenas resultados "HAVING COUNT(col) > 10" ou "HAVING SUM(col) > 100"
  • 10. MySQL – Comandos  REPLACE Funciona igual o INSERT, mas caso já exista uma linha com a mesma PK ou UK esta linha é apagada e a nova é colocada em seu lugar (funcionando como um UPDATE)
  • 11. MySQL – Comandos  Tipo de dado SET e ENUM name ENUM('small','medium','large') 1 - small, 2 - medium, 3 - large col SET('a','b') aceita "","a","b","a,b"
  • 12. MySQL – Comandos  Subquery SELECT * FROM PROFILE WHERE ID IN (SELECT ID FROM PROFILESTATUS) SELECT * FROM (SELECT ID, GENDER, AGE FROM PROFILE WHERE EDUCATION=3) pro, (SELECT PROFILE, SITE FROM VISIT WHERE DATE='2011- 12-06') vis WHERE pro.ID=vis.PROFILE
  • 13. MySQL – Comandos  Subquery SELECT * FROM PROFILE WHERE ID IN (SELECT ID FROM PROFILESTATUS) SELECT * FROM (SELECT ID, GENDER, AGE FROM PROFILE WHERE EDUCATION=3) pro, (SELECT PROFILE, SITE FROM VISIT WHERE DATE='2011- 12-06') vis WHERE pro.ID=vis.PROFILE
  • 14. MySQL – Comandos  Subquery SELECT * FROM PROFILE WHERE ID IN (SELECT ID FROM PROFILESTATUS) SELECT * FROM PROFILE p, PROFILESTATUS s WHERE p.ID=s.ID SELECT * FROM (SELECT ID, GENDER, AGE FROM PROFILE WHERE EDUCATION=3) pro, (SELECT PROFILE, SITE FROM VISIT WHERE DATE='2011- 12-06') vis WHERE pro.ID=vis.PROFILE
  • 15. MySQL – Comandos  Subquery SELECT * FROM PROFILE WHERE ID IN (SELECT ID FROM PROFILESTATUS) SELECT * FROM PROFILE p, PROFILESTATUS s WHERE p.ID=s.ID SELECT * FROM (SELECT ID, GENDER, AGE FROM PROFILE WHERE EDUCATION=3) pro, (SELECT PROFILE, SITE FROM VISIT WHERE DATE='2011- 12-06') vis WHERE pro.ID=vis.PROFILE SELECT * FROM PROFILE pro,VISIT vis WHERE pro.ID=vis.PROFILE AND pro.EDUCATION=3 AND vis.DATE='2011-12-06'
  • 16. MySQL – Comandos EXPLAIN  Te diz se a query está usando índice ou não, quantas linhas foram scaneadas para achar o resultado, etc
  • 17. MySQL – Comandos Profiling  Mostra quanto demorou uma query e onde esse tempo foi gasto. Para habilitar "SET profilling=1;"
  • 18. MySQL - Índice  Entenda como o MySQL usa índices http://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
  • 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. MySQL Obrigado! Wagner Bonfiglio bonfiglio@navegg.com