mysql - wagner bonfiglio - navegg

22
WAGNER BONFIGLIO NAVEGG Workshop Buscapé MySQL Dez/2011

Upload: felipe-guimaraes

Post on 18-Nov-2014

706 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: MySQL - Wagner Bonfiglio - Navegg

W A G N E R B O N F I G L I O

N A V E G G

Workshop Buscapé MySQL

Dez/2011

Page 2: MySQL - Wagner Bonfiglio - Navegg

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.

Page 3: MySQL - Wagner Bonfiglio - Navegg

MySQL

Agenda

Storage Engine

Comandos

Índices

Dicas

Page 4: MySQL - Wagner Bonfiglio - Navegg

MySQL – Storage Engine

MyISAM

InnoDB

BLACKHOLE

MEMORY

FEDERATED

Page 5: MySQL - Wagner Bonfiglio - Navegg

MyISAM InnoDB

Não suporta transações

Não suporta FK

Lock a nível de tabelas

Cache de índice

Ruim para escrita concorrente

Otimizado para leitura

Aceita a transações

Aceita PK

Lock a nível de registro

Cache de índice e dados

Otimizado para escrita concorrente

Não é otimizado para muitas leituras

MySQL – Storage Engine

Page 6: MySQL - Wagner Bonfiglio - Navegg

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

Page 7: MySQL - Wagner Bonfiglio - Navegg

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

Page 8: MySQL - Wagner Bonfiglio - Navegg

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';

Page 9: MySQL - Wagner Bonfiglio - Navegg

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"

Page 10: MySQL - Wagner Bonfiglio - Navegg

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)

Page 11: MySQL - Wagner Bonfiglio - Navegg

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"

Page 12: MySQL - Wagner Bonfiglio - Navegg

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

Page 13: MySQL - Wagner Bonfiglio - Navegg

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

Page 14: MySQL - Wagner Bonfiglio - Navegg

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

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

Page 15: MySQL - Wagner Bonfiglio - Navegg

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

SELECT * FROM PROFILE p, PROFILESTATUS s WHERE p.ID=s.ID SELECT * FROM PROFILE pro,VISIT vis WHERE pro.ID=vis.PROFILE AND pro.EDUCATION=3 AND vis.DATE='2011-12-06'

Page 16: MySQL - Wagner Bonfiglio - Navegg

MySQL – Comandos

EXPLAIN

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

Page 17: MySQL - Wagner Bonfiglio - Navegg

MySQL – Comandos

Profiling

Mostra quanto demorou uma query e onde esse tempo foi gasto. Para habilitar "SET profilling=1;"

Page 18: MySQL - Wagner Bonfiglio - Navegg

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

Page 19: MySQL - Wagner Bonfiglio - Navegg

MySQL - Índice

Page 20: MySQL - Wagner Bonfiglio - Navegg

MySQL - Índice

Page 21: MySQL - Wagner Bonfiglio - Navegg

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!

Page 22: MySQL - Wagner Bonfiglio - Navegg

MySQL

Obrigado!

Wagner Bonfiglio [email protected]