SlideShare uma empresa Scribd logo
1 de 56
Baixar para ler offline
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 <jeronimo.fagundes@kinghost.com.br>
Rodrigo Paris <rodrigo.paris@kinghost.com.br>
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 |
Objetivo
Ao 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 alvo
Desenvolvedores de software
Demais pessoas com interesse na área de bancos de dados
Performance e Otimização de Banco de Dados MySQL | 7
Vídeo deste Webinar
http://www.kinghost.com.br/eventos-online
Assista também
Dicas 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
------------
cpf
nome
admissao
primeiro_trimestre
-----------------
cpf
nome
admissao
segundo_trimestre
-----------------
cpf
nome
admissao
terceiro_trimestre
-----------------
cpf
nome
admissao
quarto_trimestre
-----------------
cpf
nome
admissao
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
-----------------
cpf
nome
admissao
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
------------
cpf
nome
filial
regiao_norte
-----------------
cpf
nome
filial
regiao_sul
-----------------
cpf
nome
filial
regiao_leste
-----------------
cpf
nome
filial
regiao_oeste
-----------------
cpf
nome
filial
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
------------
id
id_cliente
valor
descrição
p0 (resto 0)
-----------------
id
id_cliente
valor
descrição
p1 (resto 1)
-----------------
id
id_cliente
valor
descrição
p2 (resto 2)
-----------------
id
id_cliente
valor
descrição
p3 (resto 3)
-----------------
id
id_cliente
valor
descriçã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
--------
id
id_malote
endereço
enviado
Cartas_a_enviar
-------------------
id
id_malote
endereço
enviado
Cartas_enviadas
-------------------
id
id_malote
endereço
enviado
Particionamento por enviado
0 1
Cartas_a_enviar_0
---------------------
id
id_malote
endereço
enviado
Subparticionamento por id_malote
(resto da divisão de id_malote por 512)
Cartas_a_enviar_1
---------------------
id
id_malote
endereço
enviado
Cartas_enviadas_0
---------------------
id
id_malote
endereço
enviado
Cartas_enviadas_1
---------------------
id
id_malote
endereço
enviado
Cartas_a_enviar_2
---------------------
id
id_malote
endereço
enviado
Cartas_a_enviar_3
---------------------
id
id_malote
endereço
enviado
Cartas_enviadas_2
---------------------
id
id_malote
endereço
enviado
Cartas_enviadas_3
---------------------
id
id_malote
endereço
enviado
Cartas_a_enviar_510
---------------------
id
id_malote
endereço
enviado
Cartas_a_enviar_511
---------------------
id
id_malote
endereço
enviado
Cartas_enviadas_510
---------------------
id
id_malote
endereço
enviado
Cartas_enviadas_511
---------------------
id
id_malote
endereço
enviado
... ...
Performance e Otimização de Banco de Dados MySQL |
35
Subparticionamento
CREATE 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 JOINS
SELECT p.numero_pedido, c.nome FROM Pedidos AS p
JOIN Clientes AS c
ON p.cpf_cliente = c.cpf
WHERE 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 MAX
SELECT MAX(valor) FROM Dividas
○ Colunas utilizadas para GROUP BY ou ORDER BY
SELECT MAX(valor) FROM Dividas
GROUP BY id_cliente
ORDER 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 por
i. cpf ASC
ii. data_nascimento ASC
iii. valor_divida ASC
○ Vale para consultas
i. … 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 por
i. cpf ASC
ii. data_nascimento ASC
iii. valor_divida ASC
○ Não vale para consultas
i. … 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árias
EXPLAIN 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 KingHost
Você é 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 desconto
por 6 meses
Código promocional:
webinarkinghost
Performance e Otimização de Banco de Dados MySQL |
Obrigado!
Dúvidas e sugestões
Jeronimo Fagundes - jeronimo.fagundes@kinghost.com.br
Rodrigo Paris - rodrigo.paris@kinghost.com.br
http://www.kinghost.com.br/eventos-online

Mais conteúdo relacionado

Mais procurados

Monitoring your Python with Prometheus (Python Ireland April 2015)
Monitoring your Python with Prometheus (Python Ireland April 2015)Monitoring your Python with Prometheus (Python Ireland April 2015)
Monitoring your Python with Prometheus (Python Ireland April 2015)Brian Brazil
 
Maximum Overdrive: Tuning the Spark Cassandra Connector
Maximum Overdrive: Tuning the Spark Cassandra ConnectorMaximum Overdrive: Tuning the Spark Cassandra Connector
Maximum Overdrive: Tuning the Spark Cassandra ConnectorRussell Spitzer
 
MySQL 8.0 EXPLAIN ANALYZE
MySQL 8.0 EXPLAIN ANALYZEMySQL 8.0 EXPLAIN ANALYZE
MySQL 8.0 EXPLAIN ANALYZENorvald Ryeng
 
Bulk Loading into Cassandra
Bulk Loading into CassandraBulk Loading into Cassandra
Bulk Loading into CassandraBrian Hess
 
MySQL Database Monitoring: Must, Good and Nice to Have
MySQL Database Monitoring: Must, Good and Nice to HaveMySQL Database Monitoring: Must, Good and Nice to Have
MySQL Database Monitoring: Must, Good and Nice to HaveSveta Smirnova
 
How the Postgres Query Optimizer Works
How the Postgres Query Optimizer WorksHow the Postgres Query Optimizer Works
How the Postgres Query Optimizer WorksEDB
 
SQL Tuning, takes 3 to tango
SQL Tuning, takes 3 to tangoSQL Tuning, takes 3 to tango
SQL Tuning, takes 3 to tangoMauro Pagano
 
Container Performance Analysis
Container Performance AnalysisContainer Performance Analysis
Container Performance AnalysisBrendan Gregg
 
ProxySQL High Avalability and Configuration Management Overview
ProxySQL High Avalability and Configuration Management OverviewProxySQL High Avalability and Configuration Management Overview
ProxySQL High Avalability and Configuration Management OverviewRené Cannaò
 
PHP Object Injection Vulnerability in WordPress: an Analysis
PHP Object Injection Vulnerability in WordPress: an AnalysisPHP Object Injection Vulnerability in WordPress: an Analysis
PHP Object Injection Vulnerability in WordPress: an AnalysisPositive Hack Days
 
Oracle Extended Clusters for Oracle RAC
Oracle Extended Clusters for Oracle RACOracle Extended Clusters for Oracle RAC
Oracle Extended Clusters for Oracle RACMarkus Michalewicz
 
Mysql Explain Explained
Mysql Explain ExplainedMysql Explain Explained
Mysql Explain ExplainedJeremy Coates
 
Better Monitoring for Python: Inclusive Monitoring with Prometheus (Pycon Ire...
Better Monitoring for Python: Inclusive Monitoring with Prometheus (Pycon Ire...Better Monitoring for Python: Inclusive Monitoring with Prometheus (Pycon Ire...
Better Monitoring for Python: Inclusive Monitoring with Prometheus (Pycon Ire...Brian Brazil
 
MySQL Query And Index Tuning
MySQL Query And Index TuningMySQL Query And Index Tuning
MySQL Query And Index TuningManikanda kumar
 
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationPercona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationmysqlops
 
Raffi Krikorian, Twitter Timelines at Scale
Raffi Krikorian, Twitter Timelines at ScaleRaffi Krikorian, Twitter Timelines at Scale
Raffi Krikorian, Twitter Timelines at ScaleMariano Amartino
 
Kafka Quotas Talk at LinkedIn
Kafka Quotas Talk at LinkedInKafka Quotas Talk at LinkedIn
Kafka Quotas Talk at LinkedInAditya Auradkar
 
MySql Practical Partitioning
MySql Practical PartitioningMySql Practical Partitioning
MySql Practical PartitioningAndrei Tsibets
 

Mais procurados (20)

Monitoring your Python with Prometheus (Python Ireland April 2015)
Monitoring your Python with Prometheus (Python Ireland April 2015)Monitoring your Python with Prometheus (Python Ireland April 2015)
Monitoring your Python with Prometheus (Python Ireland April 2015)
 
Maximum Overdrive: Tuning the Spark Cassandra Connector
Maximum Overdrive: Tuning the Spark Cassandra ConnectorMaximum Overdrive: Tuning the Spark Cassandra Connector
Maximum Overdrive: Tuning the Spark Cassandra Connector
 
MySQL 8.0 EXPLAIN ANALYZE
MySQL 8.0 EXPLAIN ANALYZEMySQL 8.0 EXPLAIN ANALYZE
MySQL 8.0 EXPLAIN ANALYZE
 
Bulk Loading into Cassandra
Bulk Loading into CassandraBulk Loading into Cassandra
Bulk Loading into Cassandra
 
MySQL Database Monitoring: Must, Good and Nice to Have
MySQL Database Monitoring: Must, Good and Nice to HaveMySQL Database Monitoring: Must, Good and Nice to Have
MySQL Database Monitoring: Must, Good and Nice to Have
 
Explain that explain
Explain that explainExplain that explain
Explain that explain
 
Mentor Your Indexes
Mentor Your IndexesMentor Your Indexes
Mentor Your Indexes
 
How the Postgres Query Optimizer Works
How the Postgres Query Optimizer WorksHow the Postgres Query Optimizer Works
How the Postgres Query Optimizer Works
 
SQL Tuning, takes 3 to tango
SQL Tuning, takes 3 to tangoSQL Tuning, takes 3 to tango
SQL Tuning, takes 3 to tango
 
Container Performance Analysis
Container Performance AnalysisContainer Performance Analysis
Container Performance Analysis
 
ProxySQL High Avalability and Configuration Management Overview
ProxySQL High Avalability and Configuration Management OverviewProxySQL High Avalability and Configuration Management Overview
ProxySQL High Avalability and Configuration Management Overview
 
PHP Object Injection Vulnerability in WordPress: an Analysis
PHP Object Injection Vulnerability in WordPress: an AnalysisPHP Object Injection Vulnerability in WordPress: an Analysis
PHP Object Injection Vulnerability in WordPress: an Analysis
 
Oracle Extended Clusters for Oracle RAC
Oracle Extended Clusters for Oracle RACOracle Extended Clusters for Oracle RAC
Oracle Extended Clusters for Oracle RAC
 
Mysql Explain Explained
Mysql Explain ExplainedMysql Explain Explained
Mysql Explain Explained
 
Better Monitoring for Python: Inclusive Monitoring with Prometheus (Pycon Ire...
Better Monitoring for Python: Inclusive Monitoring with Prometheus (Pycon Ire...Better Monitoring for Python: Inclusive Monitoring with Prometheus (Pycon Ire...
Better Monitoring for Python: Inclusive Monitoring with Prometheus (Pycon Ire...
 
MySQL Query And Index Tuning
MySQL Query And Index TuningMySQL Query And Index Tuning
MySQL Query And Index Tuning
 
Percona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimizationPercona Live 2012PPT: MySQL Query optimization
Percona Live 2012PPT: MySQL Query optimization
 
Raffi Krikorian, Twitter Timelines at Scale
Raffi Krikorian, Twitter Timelines at ScaleRaffi Krikorian, Twitter Timelines at Scale
Raffi Krikorian, Twitter Timelines at Scale
 
Kafka Quotas Talk at LinkedIn
Kafka Quotas Talk at LinkedInKafka Quotas Talk at LinkedIn
Kafka Quotas Talk at LinkedIn
 
MySql Practical Partitioning
MySql Practical PartitioningMySql Practical Partitioning
MySql Practical Partitioning
 

Semelhante a Otimização MySQL com Indexação, Particionamento e Infraestrutura

Introdução ao MySQL 5.6
Introdução ao MySQL 5.6Introdução ao MySQL 5.6
Introdução ao MySQL 5.6Wagner Bianchi
 
Uso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlUso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlLocaweb
 
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)Dirceu Resende
 
SGBD - ORACLE - JAVA
SGBD - ORACLE - JAVASGBD - ORACLE - JAVA
SGBD - ORACLE - JAVAssuser4cf889
 
Banco II - PostgreSQL - Funções
Banco II - PostgreSQL - FunçõesBanco II - PostgreSQL - Funções
Banco II - PostgreSQL - FunçõesGustavo Sávio
 
Caçadores de Mitos: A virtualização dos dados pode sustentar o desempenho com...
Caçadores de Mitos: A virtualização dos dados pode sustentar o desempenho com...Caçadores de Mitos: A virtualização dos dados pode sustentar o desempenho com...
Caçadores de Mitos: A virtualização dos dados pode sustentar o desempenho com...Denodo
 
Mapeamento brb 2013 em videoaulas do provas de ti google drive
Mapeamento brb 2013 em videoaulas do provas de ti   google driveMapeamento brb 2013 em videoaulas do provas de ti   google drive
Mapeamento brb 2013 em videoaulas do provas de ti google driveffabii
 
Big data e PostgreSQL
Big data e PostgreSQLBig data e PostgreSQL
Big data e PostgreSQLEuler Taveira
 
SQL Day 2016 - SQL Server x Oracle
SQL Day 2016 - SQL Server x OracleSQL Day 2016 - SQL Server x Oracle
SQL Day 2016 - SQL Server x OracleFlávio Farias
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeiMasters
 
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0Marcos William Valentini
 
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0Marcos William Valentini
 
TechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
TechEd 2010: SQL Server com Foco em Diagnóstico de DesempenhoTechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
TechEd 2010: SQL Server com Foco em Diagnóstico de DesempenhoFabrício Catae
 
TechEd 2010: Escalando aplicações OLTP:Design de aplicação e considerações pa...
TechEd 2010: Escalando aplicações OLTP:Design de aplicação e considerações pa...TechEd 2010: Escalando aplicações OLTP:Design de aplicação e considerações pa...
TechEd 2010: Escalando aplicações OLTP:Design de aplicação e considerações pa...Fabrício Catae
 
Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...
Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...
Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...Renato Groff
 
Funcionalidades das versões 9.x do PostgreSQL
Funcionalidades das versões 9.x do PostgreSQLFuncionalidades das versões 9.x do PostgreSQL
Funcionalidades das versões 9.x do PostgreSQLMatheus Espanhol
 
Analise de Performance Usando o SO
Analise de Performance Usando o SOAnalise de Performance Usando o SO
Analise de Performance Usando o SORaul Oliveira
 
Gerenciamento e administração de Redes
Gerenciamento e administração de RedesGerenciamento e administração de Redes
Gerenciamento e administração de RedesHelder Lopes
 
Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018
Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018
Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018Renato Groff
 

Semelhante a Otimização MySQL com Indexação, Particionamento e Infraestrutura (20)

Introdução ao MySQL 5.6
Introdução ao MySQL 5.6Introdução ao MySQL 5.6
Introdução ao MySQL 5.6
 
Uso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sqlUso de estatísticas pelo postgre sql
Uso de estatísticas pelo postgre sql
 
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
SQL Server ES - Escrevendo queries rápidas (Performance/Query Tuning)
 
SGBD - ORACLE - JAVA
SGBD - ORACLE - JAVASGBD - ORACLE - JAVA
SGBD - ORACLE - JAVA
 
Banco II - PostgreSQL - Funções
Banco II - PostgreSQL - FunçõesBanco II - PostgreSQL - Funções
Banco II - PostgreSQL - Funções
 
Caçadores de Mitos: A virtualização dos dados pode sustentar o desempenho com...
Caçadores de Mitos: A virtualização dos dados pode sustentar o desempenho com...Caçadores de Mitos: A virtualização dos dados pode sustentar o desempenho com...
Caçadores de Mitos: A virtualização dos dados pode sustentar o desempenho com...
 
Mapeamento brb 2013 em videoaulas do provas de ti google drive
Mapeamento brb 2013 em videoaulas do provas de ti   google driveMapeamento brb 2013 em videoaulas do provas de ti   google drive
Mapeamento brb 2013 em videoaulas do provas de ti google drive
 
Big data e PostgreSQL
Big data e PostgreSQLBig data e PostgreSQL
Big data e PostgreSQL
 
Sql proficiente
Sql proficienteSql proficiente
Sql proficiente
 
SQL Day 2016 - SQL Server x Oracle
SQL Day 2016 - SQL Server x OracleSQL Day 2016 - SQL Server x Oracle
SQL Day 2016 - SQL Server x Oracle
 
Dicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato GroffeDicas para uma maior performance em APIs REST - Renato Groffe
Dicas para uma maior performance em APIs REST - Renato Groffe
 
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
 
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
Pgday Campinas 2015 - Uma visão do PPAS 9.4 e PEM 5.0
 
TechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
TechEd 2010: SQL Server com Foco em Diagnóstico de DesempenhoTechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
TechEd 2010: SQL Server com Foco em Diagnóstico de Desempenho
 
TechEd 2010: Escalando aplicações OLTP:Design de aplicação e considerações pa...
TechEd 2010: Escalando aplicações OLTP:Design de aplicação e considerações pa...TechEd 2010: Escalando aplicações OLTP:Design de aplicação e considerações pa...
TechEd 2010: Escalando aplicações OLTP:Design de aplicação e considerações pa...
 
Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...
Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...
Dicas para uma maior performance em APIs REST - Tech Meetup - Itaú Unibanco -...
 
Funcionalidades das versões 9.x do PostgreSQL
Funcionalidades das versões 9.x do PostgreSQLFuncionalidades das versões 9.x do PostgreSQL
Funcionalidades das versões 9.x do PostgreSQL
 
Analise de Performance Usando o SO
Analise de Performance Usando o SOAnalise de Performance Usando o SO
Analise de Performance Usando o SO
 
Gerenciamento e administração de Redes
Gerenciamento e administração de RedesGerenciamento e administração de Redes
Gerenciamento e administração de Redes
 
Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018
Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018
Dicas para uma maior performance em APIs REST - DEVPIRA Festival - Dezembro-2018
 

Mais de KingHost - Hospedagem de sites

Mais de KingHost - Hospedagem de sites (11)

KingCode: o Culture Code da KingHost
KingCode: o Culture Code da KingHostKingCode: o Culture Code da KingHost
KingCode: o Culture Code da KingHost
 
Painel: Batalha de Programador
Painel: Batalha de ProgramadorPainel: Batalha de Programador
Painel: Batalha de Programador
 
Web Components e o desenvolvimento de aplicações web modernas
Web Components e o desenvolvimento de aplicações web modernasWeb Components e o desenvolvimento de aplicações web modernas
Web Components e o desenvolvimento de aplicações web modernas
 
Utilizando Docker para escalonar aplicações Node.Js
Utilizando Docker para escalonar aplicações Node.JsUtilizando Docker para escalonar aplicações Node.Js
Utilizando Docker para escalonar aplicações Node.Js
 
Front vs Back: Tornando o mundo Web mais fácil
Front vs Back: Tornando o mundo Web mais fácil Front vs Back: Tornando o mundo Web mais fácil
Front vs Back: Tornando o mundo Web mais fácil
 
Programação na Indústria de Jogos
Programação na Indústria de JogosProgramação na Indústria de Jogos
Programação na Indústria de Jogos
 
[Webinar] Utilizando o Design Thinking para Melhorar seus Projetos Online
[Webinar] Utilizando o Design Thinking para Melhorar seus Projetos Online[Webinar] Utilizando o Design Thinking para Melhorar seus Projetos Online
[Webinar] Utilizando o Design Thinking para Melhorar seus Projetos Online
 
[Webinar] Refatoração em PHP
[Webinar] Refatoração em PHP[Webinar] Refatoração em PHP
[Webinar] Refatoração em PHP
 
[E-book] Como criar e manter um site ou blog com o Wordpress
[E-book] Como criar e manter um site ou blog com o Wordpress[E-book] Como criar e manter um site ou blog com o Wordpress
[E-book] Como criar e manter um site ou blog com o Wordpress
 
[E-book] Como minha empresa pode explorar as redes sociais
[E-book] Como minha empresa pode explorar as redes sociais[E-book] Como minha empresa pode explorar as redes sociais
[E-book] Como minha empresa pode explorar as redes sociais
 
[Whitepaper] SSL Kinghost
[Whitepaper] SSL Kinghost[Whitepaper] SSL Kinghost
[Whitepaper] SSL Kinghost
 

Otimização MySQL com Indexação, Particionamento e Infraestrutura

  • 1. Performance e Otimização de Banco de Dados MySQL Começaremos em alguns minutos...
  • 2. Performance e Otimização de Banco de Dados MySQL Começaremos em 1 minuto...
  • 3. Performance e Otimização de Banco de Dados MySQL Jeronimo Fagundes <jeronimo.fagundes@kinghost.com.br> Rodrigo Paris <rodrigo.paris@kinghost.com.br>
  • 4. 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. 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 |
  • 6. Objetivo Ao 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 alvo Desenvolvedores de software Demais pessoas com interesse na área de bancos de dados
  • 7. Performance e Otimização de Banco de Dados MySQL | 7 Vídeo deste Webinar http://www.kinghost.com.br/eventos-online Assista também Dicas Práticas para Otimização de Sites, de Felipe Olivaes e Felipe Braz
  • 8. 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 |
  • 9. 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. 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. 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. 12 Quais os tipos de índices ? • Compostos X Simples • Internos X Externos Performance e Otimização de Banco de Dados MySQL |
  • 13. 13 Por que utilizar índices ? • Maior Agilidade em buscas • Menor consumo de recursos Performance e Otimização de Banco de Dados MySQL |
  • 14. 2. Particionamento de Tabelas 14 Dividindo sua tabela em sub-tabelas menores Performance e Otimização de Banco de Dados MySQL |
  • 16. 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. 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. 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. 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 |
  • 21. 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 ----------------- cpf nome admissao 4 a 6 Performance e Otimização de Banco de Dados MySQL |
  • 22. 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. 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. 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 |
  • 26. 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. 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. 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. 29 Pedidos ------------ id id_cliente valor descrição p0 (resto 0) ----------------- id id_cliente valor descrição p1 (resto 1) ----------------- id id_cliente valor descrição p2 (resto 2) ----------------- id id_cliente valor descrição p3 (resto 3) ----------------- id id_cliente valor descriçã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. 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. 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. 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. 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. 34 Cartas -------- id id_malote endereço enviado Cartas_a_enviar ------------------- id id_malote endereço enviado Cartas_enviadas ------------------- id id_malote endereço enviado Particionamento por enviado 0 1 Cartas_a_enviar_0 --------------------- id id_malote endereço enviado Subparticionamento por id_malote (resto da divisão de id_malote por 512) Cartas_a_enviar_1 --------------------- id id_malote endereço enviado Cartas_enviadas_0 --------------------- id id_malote endereço enviado Cartas_enviadas_1 --------------------- id id_malote endereço enviado Cartas_a_enviar_2 --------------------- id id_malote endereço enviado Cartas_a_enviar_3 --------------------- id id_malote endereço enviado Cartas_enviadas_2 --------------------- id id_malote endereço enviado Cartas_enviadas_3 --------------------- id id_malote endereço enviado Cartas_a_enviar_510 --------------------- id id_malote endereço enviado Cartas_a_enviar_511 --------------------- id id_malote endereço enviado Cartas_enviadas_510 --------------------- id id_malote endereço enviado Cartas_enviadas_511 --------------------- id id_malote endereço enviado ... ... Performance e Otimização de Banco de Dados MySQL |
  • 35. 35 Subparticionamento CREATE 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 |
  • 36. 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. 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. 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 JOINS SELECT p.numero_pedido, c.nome FROM Pedidos AS p JOIN Clientes AS c ON p.cpf_cliente = c.cpf WHERE p.estado = ‘fechado’ Performance e Otimização de Banco de Dados MySQL |
  • 39. 39 O que DEVE ser indexado? • Devem ser indexados campos utilizados frequentemente em consultas ○ Colunas usadas em buscas por MIN ou MAX SELECT MAX(valor) FROM Dividas ○ Colunas utilizadas para GROUP BY ou ORDER BY SELECT MAX(valor) FROM Dividas GROUP BY id_cliente ORDER BY data_criacao Performance e Otimização de Banco de Dados MySQL |
  • 40. 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. 41 O que DEVE ser indexado? • Valha-se dos índices compostos ○ Um índice composto por i. cpf ASC ii. data_nascimento ASC iii. valor_divida ASC ○ Vale para consultas i. … 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. 42 O que DEVE ser indexado? • Valha-se dos índices compostos ○ Um índice composto por i. cpf ASC ii. data_nascimento ASC iii. valor_divida ASC ○ Não vale para consultas i. … 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. 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. 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. 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. 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. 47 Explain Partitions • Utilize o comando EXPLAIN PARTITIONS para saber se sua consulta utiliza apenas as partições necessárias EXPLAIN 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 |
  • 48. 4. Infraestrutura 48Performance e Otimização de Banco de Dados MySQL |
  • 49. 49 Infraestrutura • Separe seu servidor de banco de dados do servidor de aplicação. Performance e Otimização de Banco de Dados MySQL |
  • 50. 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. 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. 52 Infraestrutura • Monitore consultas lentas Performance e Otimização de Banco de Dados MySQL |
  • 53. 53 Painel de controle KingHost Você é 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. 54 Painel de Performance KingHost Performance e Otimização de Banco de Dados MySQL |
  • 55. 55 Código promocional KingHost 20% de desconto por 6 meses Código promocional: webinarkinghost Performance e Otimização de Banco de Dados MySQL |
  • 56. Obrigado! Dúvidas e sugestões Jeronimo Fagundes - jeronimo.fagundes@kinghost.com.br Rodrigo Paris - rodrigo.paris@kinghost.com.br http://www.kinghost.com.br/eventos-online