SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Was ist angesagt?

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 8Emiliano Barbosa
 
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 8Emiliano Barbosa
 
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/8Emiliano Barbosa
 
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 8Emiliano Barbosa
 
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.6Wagner Bianchi
 
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 8Emiliano Barbosa
 
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 8Emiliano Barbosa
 
LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)LabMM4 (T17 - 12/13)
LabMM4 (T17 - 12/13)Carlos Santos
 
Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7Workshop - Desenvolvimento web com Drupal 7
Workshop - Desenvolvimento web com Drupal 7Sérgio Lima
 
Apresentação Oracle SGBD
Apresentação Oracle SGBDApresentação Oracle SGBD
Apresentação Oracle SGBDDenis Vieira
 

Was ist angesagt? (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
 

Andere mochten auch

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 dadosJorge Ávila Miranda
 
Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1Aplicativos II - MySQL_part1
Aplicativos II - MySQL_part1fabriciodenis
 
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 1Januário Neto
 
Banco de Dados MySQL
Banco de Dados MySQLBanco de Dados MySQL
Banco de Dados MySQLMarcus Couto
 
Comandos DDL para o MySQL
Comandos DDL para o MySQLComandos DDL para o MySQL
Comandos DDL para o MySQLArley Rodrigues
 
Psi-mod-15
Psi-mod-15Psi-mod-15
Psi-mod-15diogoa21
 
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çãoUlrich Schiel
 
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 dadosElaine Cecília Gatto
 
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 dadosdiogocbj
 

Andere mochten auch (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
 

Ähnlich wie Optimizing MySQL Performance for Large-Scale Web Analytics

Mongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopMongo Db - PHP Day Workshop
Mongo Db - PHP Day WorkshopDiego Sana
 
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 sqlrobinhoct
 
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.6Wagner Bianchi
 
3260 php truquesmagicos %281%29
3260 php truquesmagicos %281%293260 php truquesmagicos %281%29
3260 php truquesmagicos %281%29Juliana Nascimento
 
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 DadosClayton de Almeida Souza
 
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.6MySQL Brasil
 
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
 
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...Aryel Tupinambá
 
Oracle 11g resumo
Oracle 11g resumoOracle 11g resumo
Oracle 11g resumomarcosgama
 
Bad Smells em Bancos de Dados
Bad Smells em Bancos de DadosBad Smells em Bancos de Dados
Bad Smells em Bancos de DadosFabrízio Mello
 
Novidades do Sql Server 2016
Novidades do Sql Server 2016Novidades do Sql Server 2016
Novidades do Sql Server 2016Roberto Fonseca
 
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 pdoJorge Luís Gregório
 

Ähnlich wie Optimizing MySQL Performance for Large-Scale Web Analytics (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
 

Optimizing MySQL Performance for Large-Scale Web Analytics

  • 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