[webinar] performance e otimização de banco de dados mysql

56
Performance e Otimização de Banco de Dados MySQL Começaremos em alguns minutos...

Upload: kinghost-hospedagem-de-sites

Post on 29-Jan-2018

585 views

Category:

Technology


1 download

TRANSCRIPT

Performance e Otimização de Banco de Dados MySQL

Começaremos em alguns minutos...

Performance e Otimização de Banco de Dados MySQL

Começaremos em 1 minuto...

Performance e Otimização de Banco de Dados MySQL

Jeronimo Fagundes <[email protected]>Rodrigo Paris <[email protected]>

4

Jeronimo Fagundes• Líder de Desenvolvimento na KingHost

• Bacharel em Ciência da Computação pela UFRGS

• Desenvolvedor PHP há 12 anos

• Trabalha com MySQL há mais de 10 anos

• Realizou a modelagem de dados para diversos sistemas que utilizam MySQL, tendo em vista a otimização de desempenho e maximização de throughput.

Performance e Otimização de Banco de Dados MySQL |

5

Rodrigo Paris• Analista de Infraestrutura Pleno na KingHost

• Graduando em Sistemas de Informação na PUCRS

• Administrador dos servidores de banco de dados da KingHost há 3 anos

Performance e Otimização de Banco de Dados MySQL |

ObjetivoAo final do webinar, é esperado que o espectador tenha um maior conhecimento sobre a configuração de um servidor MySQL, bem como as melhores práticas para o desenvolvimento de aplicações que consumam dados deste servidor.

Performance e Otimização de Banco de Dados MySQL | 6

Público alvoDesenvolvedores de softwareDemais pessoas com interesse na área de bancos de dados

Performance e Otimização de Banco de Dados MySQL | 7

Vídeo deste Webinarhttp://www.kinghost.com.br/eventos-online

Assista tambémDicas Práticas para Otimização de Sites, de Felipe Olivaes e Felipe Braz

8

Conteúdo do curso• Indexação de Tabelas

• Particionamento de Tabelas

• Otimização de Consultas

• Infraestrutura

Performance e Otimização de Banco de Dados MySQL |

1. Indexação de Tabelas

9

Como a indexação favorece a velocidade de buscas

Performance e Otimização de Banco de Dados MySQL |

10

Entendendo os Índices

• O que são ?

• Quais os tipos ?

• Por que utilizar ?

• Quando utilizar ?

Performance e Otimização de Banco de Dados MySQL |

11

O que são os índices ?• Uma referência associada a uma chave (estrutura de dados)

• Estrutura que possibilita acesso a um item indexado vez

• Estrutura ou arquivo auxiliar associado a uma coleção de dados (banco de dados)

Performance e Otimização de Banco de Dados MySQL |

12

Quais os tipos de índices ?• Compostos X Simples

• Internos X Externos

Performance e Otimização de Banco de Dados MySQL |

13

Por que utilizar índices ?• Maior Agilidade em buscas

• Menor consumo de recursos

Performance e Otimização de Banco de Dados MySQL |

2. Particionamento de Tabelas

14

Dividindo sua tabela em sub-tabelas menores

Performance e Otimização de Banco de Dados MySQL |

15

Produtos

Produtos_1

Produtos_2

Produtos_3

Produtos_n

...

Performance e Otimização de Banco de Dados MySQL |

16

O que é o particionamento?• Uso padrão:

○ Dados e índices são armazenados em arquivo único (dependente da engine de armazenamento)

• Particionamento:

○ Dados e índices são armazenados em múltiplos arquivos, 1 por partição

• Número máximo de partições: 1024

Performance e Otimização de Banco de Dados MySQL |

17

Vantagens• Aplicação enxerga uma tabela única

• Possibilita mais dados na tabela

○ Múltiplos arquivos

○ Adia o tamanho máximo de arquivo (depende do file system)

• Remoção de dados obsoletos facilitada

○ Pode-se remover uma partição inteira de uma vez

• Desempenho de buscas MUITO otimizado

○ Requer valor da chave de particionamento na cláusula WHERE

Performance e Otimização de Banco de Dados MySQL |

18

Tipos de particionamento• RANGE [COLUMNS*]

• LIST [COLUMNS*]

• [LINEAR] HASH

• [LINEAR] KEY

*RANGE COLUMNS e LIST COLUMNS disponíveis a partir da versão 5.5 do MySQL Server.

Performance e Otimização de Banco de Dados MySQL |

19

RANGE [COLUMNS]• Particionamento baseado em intervalos de valores

• RANGE: Uma coluna do tipo INT○ PARTITION BY RANGE( YEAR(matricula) )

• RANGE COLUMNS: Múltiplas colunas de vários tipos○ PARTITION BY RANGE COLUMNS ( YEAR(matricula), id_cidade )

Performance e Otimização de Banco de Dados MySQL |

20

Funcionários------------cpfnomeadmissao

primeiro_trimestre-----------------cpfnomeadmissao

segundo_trimestre-----------------cpfnomeadmissao

terceiro_trimestre-----------------cpfnomeadmissao

quarto_trimestre-----------------cpfnomeadmissao

1 a 3 4 a 6 7 a 9 10 a 12

Mês de admissão

Performance e Otimização de Banco de Dados MySQL |

21

MySQL, por favor busque todos os funcionários admitidos em 20 maio de 2015.

SELECT * FROM Funcionarios WHERE admissao = ‘2015-05-20’

20 de maio de 2015 é uma data do mês de maio, representado pelo número 5. 5 não é menor do que 4.5 é menor do que 7.Logo, esses funcionários estão todos na partição segundo_trimestre. Buscarei apenas lá.

segundo_trimestre-----------------cpfnomeadmissao

4 a 6

Performance e Otimização de Banco de Dados MySQL |

22

RANGE CREATE TABLE `Funcionarios` (

`cpf` VARCHAR(14) NOT NULL,`nome` VARCHAR(255) NOT NULL,`admissao` DATE NOT NULL

)PARTITION BY RANGE(MONTH(admissao)) (

PARTITION primeiro_trimestre VALUES LESS THAN (4),PARTITION segundo_trimestre VALUES LESS THAN (7),PARTITION terceiro_trimestre VALUES LESS THAN (10),PARTITION quarto_trimestre VALUES LESS THAN MAXVALUE

);

Performance e Otimização de Banco de Dados MySQL |

23

RANGE COLUMNS CREATE TABLE `xyz` ( `a` INT NOT NULL, `b` INT NOT NULL, `c` DATETIME NOT NULL)PARTITION BY RANGE COLUMNS (a, MONTH(c)) ( PARTITION p0 VALUES LESS THAN (3, 7), PARTITION p1 VALUES LESS THAN (4, 9), PARTITION p2 VALUES LESS THAN (4, 11), PARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE));

Performance e Otimização de Banco de Dados MySQL |

24

LIST [COLUMNS]• Particionamento baseado em valores específicos

• LIST: Uma coluna do tipo INT○ PARTITION BY LIST( YEAR(matricula) )

• LIST COLUMNS: Múltiplas colunas de vários tipos○ PARTITION BY LIST COLUMNS ( YEAR(matricula), id_cidade )

Performance e Otimização de Banco de Dados MySQL |

25

Funcionários------------cpfnomefilial

regiao_norte-----------------cpfnomefilial

regiao_sul-----------------cpfnomefilial

regiao_leste-----------------cpfnomefilial

regiao_oeste-----------------cpfnomefilial

1, 2 e 7 3 e 9 4, 5 e 6 8

Filial

Performance e Otimização de Banco de Dados MySQL |

26

LIST CREATE TABLE `Funcionarios` (

`cpf` VARCHAR(14) NOT NULL,`nome` VARCHAR(255) NOT NULL,`filial` INT NOT NULL

)PARTITION BY LIST(filial) (

PARTITION regiao_norte VALUES IN (1, 2, 7),PARTITION regiao_sul VALUES IN (3, 9),PARTITION regiao_leste VALUES IN (4, 5, 6),PARTITION regiao_oeste VALUES IN (8),

);

Performance e Otimização de Banco de Dados MySQL |

27

LIST COLUMNS CREATE TABLE `Funcionarios` ( `cpf` VARCHAR(14) NOT NULL, `estado`VARCHAR(2) NOT NULL DEFAULT 'RS')PARTITION BY LIST COLUMNS (estado) ( PARTITION regiao_sul VALUES IN ('RS', 'SC, 'PR'), PARTITION regiao_sudeste VALUES IN ('SP', 'RJ', 'MG', 'ES'), PARTITION regiao_centro_oeste VALUES IN ('MT', 'MS', 'GO', 'DF'), PARTITION regiao_norte VALUES IN ('AC', 'AM', 'RO', 'RR', 'PA', 'AP', 'TO'), PARTITION regiao_nordeste VALUES IN ('MA', 'PI', 'CE', 'RN', 'PB', 'PE', 'AL', 'SE', 'BA'));

Performance e Otimização de Banco de Dados MySQL |

28

[LINEAR] HASH • Particionamento baseado em cálculo de resto

○ p = MOD(column, n)

○ p - Partição onde a linha é armazenada

○ MOD - função módulo (resto da divisão)

○ column - valor da coluna do tipo INT (numerador)

○ n - número de partições da tabela (denominador)

• PARTITION BY HASH ( YEAR(matricula) )

• LINEAR - Muda o cálculo de módulo para outro baseado em potências de 2

Performance e Otimização de Banco de Dados MySQL |

29

Pedidos------------idid_clientevalordescrição

p0 (resto 0)-----------------idid_clientevalordescrição

p1 (resto 1)-----------------idid_clientevalordescrição

p2 (resto 2)-----------------idid_clientevalordescrição

p3 (resto 3)-----------------idid_clientevalordescrição

0,4,8,12,16,... 1,5,9,13,17,... 2,6,10,14,18,... 3,7,11,15,19,...

Resto da divisão de id cliente pelo número de partições

Performance e Otimização de Banco de Dados MySQL |

30

[LINEAR] HASH CREATE TABLE `Pedidos` ( `id`NOT NULL AUTO_INCREMENT, `id_cliente` INT NOT NULL, `valor` DECIMAL(5, 2) NOT NULL, `descricao` VARCHAR(255) NOT NULL)PARTITION BY HASH (id_cliente)PARTITIONS 4;

Performance e Otimização de Banco de Dados MySQL |

31

[LINEAR] KEY • A expressão de particionamento pode ser zero ou mais colunas,

conforme segue:

• Se não é especificada coluna

○ Chave primária (se houver)

○ Chave única (se houver)

• Se são especificadas colunas

○ Precisam pertencer à chave primária ou chave única

Performance e Otimização de Banco de Dados MySQL |

32

[LINEAR] KEY CREATE TABLE k1 ( id INT NOT NULL, name VARCHAR(20),

PRIMARY KEY (id))PARTITION BY KEY()PARTITIONS 2;

Performance e Otimização de Banco de Dados MySQL |

33

Subparticionamento• Particionam-se as partições

• Para utilizar, seguir duas restrições

○ O tipo de partitionamento (PARTITION) precisa ser dos tipos RANGE ou LIST

○ O tipo de subparticionamento (SUBPARTITION) precisa ser dos tipos HASH ou KEY

• Portanto, não se pode subparticionar uma tabela particionada por HASH ou KEY

Performance e Otimização de Banco de Dados MySQL |

34

Cartas--------idid_maloteendereçoenviado

Cartas_a_enviar-------------------idid_maloteendereçoenviado

Cartas_enviadas-------------------idid_maloteendereçoenviado

Particionamento por enviado

0 1

Cartas_a_enviar_0---------------------idid_maloteendereçoenviado

Subparticionamento por id_malote(resto da divisão de id_malote por 512)

Cartas_a_enviar_1---------------------idid_maloteendereçoenviado

Cartas_enviadas_0---------------------idid_maloteendereçoenviado

Cartas_enviadas_1---------------------idid_maloteendereçoenviado

Cartas_a_enviar_2---------------------idid_maloteendereçoenviado

Cartas_a_enviar_3---------------------idid_maloteendereçoenviado

Cartas_enviadas_2---------------------idid_maloteendereçoenviado

Cartas_enviadas_3---------------------idid_maloteendereçoenviado

Cartas_a_enviar_510---------------------idid_maloteendereçoenviado

Cartas_a_enviar_511---------------------idid_maloteendereçoenviado

Cartas_enviadas_510---------------------idid_maloteendereçoenviado

Cartas_enviadas_511---------------------idid_maloteendereçoenviado

... ...

Performance e Otimização de Banco de Dados MySQL |

35

SubparticionamentoCREATE TABLE `Cartas` (

`id` int(11) NOT NULL AUTO_INCREMENT,`id_malote` int(11) NOT NULL,`endereco` varchar(100) NOT NULL,`enviado` TINYINY(1) NOT NULL DEFAULT 0,PRIMARY KEY (`id`,`enviado`,`id_malote`),

) ENGINE=InnoDB

PARTITION BY LIST (enviado)SUBPARTITION BY HASH (id_malote)SUBPARTITIONS 512(

PARTITION Cartas_a_enviar VALUES IN (0),PARTITION Cartas_enviadas VALUES IN (1)

);

Performance e Otimização de Banco de Dados MySQL |

3. Otimização de Consultas

36

O que fazer para que sua consulta seja mais rápida

Performance e Otimização de Banco de Dados MySQL |

37

Índices x Consultas• Os índices devem corresponder à maioria das consultas executadas em

um sistema, e vice-versa

Performance e Otimização de Banco de Dados MySQL |

38

O que DEVE ser indexado?• Devem ser indexados campos utilizados frequentemente em consultas

○ Cláusula WHERE SELECT * FROM Clientes WHERE cidade = ‘Porto Alegre’

○ Colunas de junção em JOINSSELECT p.numero_pedido, c.nome FROM Pedidos AS pJOIN Clientes AS cON p.cpf_cliente = c.cpfWHERE p.estado = ‘fechado’

Performance e Otimização de Banco de Dados MySQL |

39

O que DEVE ser indexado?• Devem ser indexados campos utilizados frequentemente em consultas

○ Colunas usadas em buscas por MIN ou MAXSELECT MAX(valor) FROM Dividas

○ Colunas utilizadas para GROUP BY ou ORDER BYSELECT MAX(valor) FROM DividasGROUP BY id_clienteORDER BY data_criacao

Performance e Otimização de Banco de Dados MySQL |

40

O que DEVE ser indexado?• Use o menor tipo de dados possível para uma coluna

○ Utiliza menos espaço em disco e em memória

○ Gera índices menores

○ Possibilidade carregar mais dados em cache ○ SELECT * FROM `tabela` PROCEDURE ANALYSE ( )

• Crie índices parciais para texto

○ Utilize no índice o número de caracteres necessários à criação de uma cardinalidade razoavelmente alta

Performance e Otimização de Banco de Dados MySQL |

41

O que DEVE ser indexado?• Valha-se dos índices compostos

○ Um índice composto pori. cpf ASC

ii. data_nascimento ASC

iii. valor_divida ASC

○ Vale para consultasi. … WHERE cpf = ‘012.345.678-90’

ii. … WHERE cpf = ‘012.345.678-90’ AND data_nascimento > ‘1985-11-18’

iii. … WHERE cpf = ‘012.345.678-90’ AND data_nascimento > ‘1985-11-18’ AND valor_divida > 250.00

Performance e Otimização de Banco de Dados MySQL |

42

O que DEVE ser indexado?• Valha-se dos índices compostos

○ Um índice composto pori. cpf ASC

ii. data_nascimento ASC

iii. valor_divida ASC

○ Não vale para consultasi. … WHERE data_nascimento > ‘1985-11-18’

ii. … WHERE valor_divida > 250.00

iii. … WHERE data_nascimento > ‘1985-11-18’ AND valor_divida > 250.00

Performance e Otimização de Banco de Dados MySQL |

43

O que NÃO DEVE ser indexado?• Evitar indexar

○ Colunas que só são usadas para exibição

○ Colunas com pouca variação de valor

■ Ex.: CPF é um bom candidato (um por pessoa, muitos valores possíveis), Gênero é um mau candidato (poucos valores possíveis: M, F, Outro, Não Informado)

■ Quanto mais valores possíveis, maior a cardinalidade do índice, e maior sua valia

■ Se a cardinalidade é baixa, o MySQL pode optar por full-scan

Performance e Otimização de Banco de Dados MySQL |

44

Particionamento x Consultas• Ao utilizar particionamento, TODAS as consultas devem especificar o

valor da(s) coluna(s) utilizada(s) na expressão de particionamento

• Caso não especifiquem, o MySQL realizará full-scan em TODAS as partições, o que terá desempenho pior do que um full-scan em tabela não-particionada

Performance e Otimização de Banco de Dados MySQL |

45

Joins• Evite joins desnecessários, pois são produtos cartesianos

• Caso sejam necessários, crie índices para facilitar a junção

Performance e Otimização de Banco de Dados MySQL |

46

Explain• Utilize o comando EXPLAIN para saber como uma consulta é executada

EXPLAIN SELECT * FROM Clientes WHERE cidade = ‘Porto Alegre’

• Exibe os índices possíveis, e quais os utilizados

○ Nenhum índice é utilizado? Talvez seja a hora de criar um!

• Se possível, evite buscas cujo explain mostre “using temporary” e/ou “using filesort”

Performance e Otimização de Banco de Dados MySQL |

47

Explain Partitions• Utilize o comando EXPLAIN PARTITIONS para saber se sua consulta

utiliza apenas as partições necessáriasEXPLAIN PARTITIONS SELECT * FROM Clientes WHERE cidade = ‘Porto Alegre’

• Se a busca envolve muitas partições, revise seu SELECT para que especifique melhor os valores possíveis da(s) coluna(s) de particionamento

Performance e Otimização de Banco de Dados MySQL |

4. Infraestrutura

48Performance e Otimização de Banco de Dados MySQL |

49

Infraestrutura• Separe seu servidor de banco de dados do servidor de aplicação.

Performance e Otimização de Banco de Dados MySQL |

50

Infraestrutura• SSD● Processo de desde 2010 ● Atualmente 100% dos servidores de banco está usando discos SSD

Performance e Otimização de Banco de Dados MySQL |

51

Infraestrutura• Rede dedicada

○ Dedicada para conexão com Banco de Dados

○ Resolução de DNS para rede interna

Performance e Otimização de Banco de Dados MySQL |

52

Infraestrutura• Monitore consultas lentas

Performance e Otimização de Banco de Dados MySQL |

53

Painel de controle KingHostVocê é beta! =)

Para testar a ferramenta de Monitoramento de Consumo em seu Painel de Controle KingHost solicite via chamado informando que você participou do Webinar!

Importante: no momento, a funcionalidade está disponível apenas para servidores Linux.

Performance e Otimização de Banco de Dados MySQL |

54

Painel de Performance KingHost

Performance e Otimização de Banco de Dados MySQL |

55

Código promocional KingHost

20% de descontopor 6 meses

Código promocional:webinarkinghost

Performance e Otimização de Banco de Dados MySQL |

Obrigado!

Dúvidas e sugestões

Jeronimo Fagundes - [email protected] Paris - [email protected]

http://www.kinghost.com.br/eventos-online