Uma atividade que toma bastante tempo do administrador ou desenvolvedor é encontrar Queries que consomem muitos recursos do servidor. Há um expressivo ganho de performance otimizando queries lentas, podendo chegar a aumentar várias vezes o tempo de resposta. Vamos ver como a ferramenta Query Analyzer pode nos ajudar nesta tarefa e ainda conhecer um pouco melhor o que está contido na edição MySQL Enterprise, com foco principalmente em desenvolvedores.
3. Questões difíceis
… problemas de performance? … servidores down?
… queries lentas, custosas? … política de segurança, muda?
… onde, quando, como “tunar”? … produtividade de desenv./QA?
… problemas de replicação? … qual versão do MySQL rodar?
… os sistemas escalarão? … posso recuperar?
4. Questões difíceis
… problemas de performance? … servidores down?
… queries lentas, custosas? … política de segurança, muda?
… onde, quando, como “tunar”? … produtividade de desenv./QA?
… problemas de replicação? … qual versão do MySQL rodar?
… os sistemas escalarão? … posso recuperar?
5. Profiling
In software engineering, profiling ("program profiling",
"software profiling") is a form of dynamic program
analysis that measures, for example, the usage of
memory, the usage of particular instructions, or
frequency and duration of function calls. The
most common use of profiling information is to aid
program optimization.
6. Responsabilidades comuns para BDs 1/2
Desenvolvedor/Arquiteto
• definir mecanismos eficientes de interação entre aplicação e BD
• dimensionamento/upgrade de hardware
• responsabilidade sobre a performance geral da aplicação,
além de outros requisitos não funcionais
• correção de problemas em QA ou Produção (inclusive
reescrita de queries para otimização)
SysAdmin/DBA
• otimização do esquema de dados
• criação e utilização correta de índices
• ajuste de variáveis no MySQL Server (tuning)
• monitoramento e ações corretivas
• manutenção dos indices e dados
7. Responsabilidades comuns para BDs 2/2
AMBOS papéis
• modelagem do esquema de dados mais eficiente
• identificar e melhorar queries que consomem muitos
recursos
normalmente a razão #1
de perdas de performance
Lembre-se:
o objetivo do profiling é otimizar!
8. Otimização de Queries em 2 passos
1. seja um incansável caçador de Queries
lentas mais executadas
• MySQL Query Analyzer
• maior produtividade, menor overhead
• Recursos nativos
• slow query log, mysqldumpslow > SHOW
PROCESSLIST > select_scan, select_full_join
2. aplique melhorias
• indexação, EXPLAIN
• reescrita de queries
• re-modelagem do esquema de dados
9. Otimização de Queries em 2 passos
1. seja um incansável caçador de Queries
lentas mais executadas
• MySQL Query Analyzer
• maior produtividade, menor overhead
• Recursos nativos
• slow query log, mysqldumpslow > SHOW
PROCESSLIST > select_scan, select_full_join
2. aplique melhorias
• indexação, EXPLAIN
• reescrita de queries
• re-modelagem do esquema de dados
11. Navegando na execução da Query
Exemplo query exec
com substitução de
variável
Stack Trace com
informações do
código-fonte
EXPLAIN completo
para otimização de
índices
12. Integração com MyOracleSupport
MySQL Support Diagnostic Reports
• Coleta e empacota rapidamente dados do MySQL, SO,
diagnósticos de Queries em um relatório para o Oracle Support
• Acompanhamento de tickets do Oracle Support (SRs)
• Tempo de resposta acelerado, menor risco
13. Otimização de Queries em 2 passos
1. seja um incansável caçador de Queries
lentas mais executadas
• MySQL Query Analyzer
• maior produtividade, menor overhead
• Recursos nativos
• slow query log, mysqldumpslow > SHOW
PROCESSLIST > select_scan, select_full_join
2. aplique melhorias
• indexação, EXPLAIN
• reescrita de queries
• re-modelagem do esquema de dados
14. Índices e EXPLAIN
1. Índices são intensamente utilizados
• operações de Filtro
• operações Join
• operações Sort
2. EXPLAIN mostra como (e se) estão sendo utilizados
3. Boas práticas
• não criar índices desnecessários (degrada performance
de escrita)
• não criar indices com inicio idêntico (leading part)
• não usar toda string para os índices (apenas uma parte
inicial já basta)
• 16 bytes ou menos
• com mais de 32 bytes devem ter cuidados especiais (como
cache próprio MyISAM)
• crie colunas com hashes e indexe-os ao invés de string
longas
http://dev.mysql.com/doc/refman/5.5/en/using-explain.html
15. Reescreva Queries lentas
1. Utilize IN clause
• SELECT ... WHERE idx IN(1,23,345,456)
• muito mais rápido que JOINS
• ex. 1k-2k vezes para 80k items
2. Não encapsule seus índices no WHERE
• Mantenha índices isolados no lado esquerdo da
condição
• Select ... Where func(idx) = 20 [index ignored]
• Select .. Where idx = otherfunc(20) [may use index]
3. Evite % no início do LIKE em um índice
• Select ... Where idx LIKE(„ABC%‟) pode usar índice
• Select ... Where idx LIKE(„%XYZ‟) fará full table scan
4. Use UNION ALL quando apropriado
• default é UNION DISTINCT
5. Entenda Left/Right JOINS e use apropriadamente
http://dev.mysql.com/doc/refman/5.5/en/query-speed.html
16. Re-modelagem do esquema de dados
1. Storage Engine (tipo de tabela) adequado
• InnoDB
• MyISAM
• Outros: Memory, Archive ...
2. Tipos de dados e tamanhos corretos
• Tamanhos menores, melhor performance
• Não use 255 VARCHAR para tudo
• Considere o uso de ENUM e SET
• Temporary Tables e Caches estouram tamanho total
• PROCEDURE ANALYZE
3. Comprima strings longas
• COMPRESS e UNCOMPRESS
• No caso de InnoDB, mais importante para versões
anteriros a 5.5
http://www.mysql.com/why-mysql/white-papers/mysql_5.5_perf_myisam_innodb.php
http://dev.mysql.com/doc/refman/5.5/en/procedure-analyse.html
18. Bônus: boas práticas gerais 1/2
1. atue nos gargalos
2. não tenha vergonha de perguntar: Google, Forums, MyOracleSupport
3. monitore, seja pró ativo e aceite alguns conselhos: Advisors
4. nunca faça mudanças no ambiente de produção, tenha um
bom conjunto de testes
1. benchmark: DBT2, SysBench, mysqlslap, mybench
2. testes automatizados com queries reais: general log, MySQL
Proxy, TCP Dump
3. simule carga que se aproxima do ambiente de produção
5. defina objetivos e uma base de comparação (antes e depois)
1. aumentar Transações Por Segundo (TPS)
2. aumentar usuários simultâneos
3. diminuir IO time wait
6. mude apenas uma coisa por vez
1. identifique um possível conjunto de mudanças
2. tente mudá-las separadamente
3. tente combinações
19. Bônus: boas práticas gerais 2/2
7. monitore os resultados
• performance das queries
• foco no gargalo - mais executadas e que tomam maior
tempo
• Throughput
• média dos tempos das queries melhor que tempos únicos
das queries
• CPU
• IO
• Network bandwidth
8. documente e salve os resultados, mantenha seu histórico para
seu uso e da equipe
21. Links
MySQL Essentials Webinars (Partes de 1 a 7)
mysql.com/news-and-events/web-seminars/mysql-essentials.html
MySQL Training (incluindo MySQL Performance Tuning)
education.oracle.com
MySQL Performance Forum
forums.mysql.com/list.php?24
MySQL White Papers
dev.mysql.com/why-mysql/white-papers
MySQL Enterprise Monitor (trial 30 dias)
edelivery.oracle.com
22. Subscrições MySQL
Cluster
Enterprise Carrier
Valor Agregado
Edition Grade
Standard
Enterprise +
Edition
Standard +
• MySQL Database • Plug-Ins
• Premier Support • Enterprise Monitor
• Workbench SE • Enterprise Backup • Cluster Manager
23. Oracle Suporte para o MySQL
* MySQL Premier Support – 5 anos, começando pelo GA
28. Extensões Comerciais
• Enterprise Security
• Plug-In: MySQL External Authentication
• Enterprise Scalability
• Plug-In: MySQL Thread Pool
29. Windows Authentication
Connect as
1. MyDomainjoe faz login App
na aplicação com senha
Windows
Connector
Connect as Connect as
3. A aplicação conecta-se 2. MyDomainjoe é
ao MySQL com usuário autenticado via
win_joe. LDAP/AD
Connected Connect as
4. Tokens são verificados, o
usuário win_joe é autenticado
com Windows login, porém
Authenticate
Windows com privilégios do MySQL.
LDAP/AD
Auth
CREATE USER win_joe
IDENTIFIED WITH authentication_windows
AS ‘joe';
30. Gestão Padrão do Thread Pool
Clientes Externos
Gestão Padrão Execução das Conexões das Threads
doThread Pool
Conexões /
Declarações
atribuídas aos
Threads durante
sua existência
Clientes Internos
• Conexões são atribuídas a 1 thread durante a existência da Conexão.
• A mesma thread é usada para todas as declarações de execução (single
threaded)
31. Com o Thread Pool Habilitado
Clientes Externos
Thread Pool Execução das Conexões das Threads
Grupo Thread 1
Grupo Thread 1
Threads 1 - 4096
Grupo Thread 2 Grupo Thread 2
Threads 4097 - 8193
Grupo Thread N
Grupo Thread N
Threads 8194 - N
Clientes Internos
• Pool contém um número de Grupo de Threads(default = 16), cada um gerencia até 4096
threads reusáveis
• Cada conexão é atribuída ao grupo de thread via round robin
mantém a performance em altas cargas de
usuários/conexões
32. Comparativo com/sem Thread Pool
MySQL 5.5 Sysbench OLTP Leitura/Escrita
8,000
7,000
Transações por segundo
MySQL Enterprise Edition
6,000
ComThread Pool
5,000
4,000
3,000
2,000
1,000
0 MySQL Community Server
Sem Thread Pool
Conexões Simultâneas no Banco de Dados MySQL 5.5.16
Oracle Linux 6.1, Unbreakable Kernel 2.6.32
2 sockets, 24 cores, 2 X 12-core
Intel(R) Xeon(R) X5670 2.93GHz CPUs
20x Melhor Escalabilidade comThread Pool 72GB DDR3 RAM
2 X LSI SCSI Disk (MR9261-8i) (597GB)
33. Comparativo com/sem Thread Pool
MySQL 5.5 Sysbench OLTP Apenas Leitura
12,000
10,000 MySQL Enterprise Edition
ComThread Pool
8,000
6,000
T
4,000
MySQL Community Server
2,000
SemThread Pool
0
Conexões Simultâneas no Banco de Dados MySQL 5.5.16
Oracle Linux 6.1, Unbreakable Kernel 2.6.32
2 sockets, 24 cores, 2 X 12-core
Intel(R) Xeon(R) X5670 2.93GHz CPUs
72GB DDR3 RAM
3x Melhor Escalabilidade com Thread Pool 2 X LSI SCSI Disk (MR9261-8i) (597GB)
34. MySQL Enterprise Monitor
• Visão única e consolidada em
todo o ambiente MySQL
• Auto-descoberta dos servidores
MySQL, topologias de
replicação
• Regras personalizáveis de
monitorização e alertas
• Identificação de problemas
antes que eles ocorram
• Reduz o risco de inatividade
• Facilita “scale out” sem exigir
mais DBAs
Assistente virtual do DBA MySQL!
http://mysql.com/trials/
38. Restores
Restore é até 16x mais rápido do que mysqldump
- mysqldump performance não é linear (mais tables/indexes impacta na performance)
- MySQL Enterprise performance é quase linear
41. MySQL Treinamento e Certificação
Treinamentos
MySQL DBA MySQLDeveloper Certificações
MySQL Boot Camp MySQL Boot Camp
Accelerated Accelerated
MySQL Performance MySQL Performance
Tuning Boot Camp Tuning Boot Camp
Accelerated Accelerated
MySQL for Begginers MySQL for Begginers
MySQL for Database MySQL and PHP
Administrators Developing Dynamic
Web Applicationg
MySQL Performance
Tuning MySQL for Developers
MySQL High MySQL Advanced
Availability Stored Procedures
MySQL Cluster
Opcional
Necessário
http://education.oracle.com
43. Questões Difíceis, Soluções Reais
… problemas de performance? … servidores down?
• MySQL Enterprise Scalability • Oracle Premier 7x24 Support
• MySQL Enterprise Monitor, Advisors, Query Analyzer • MySQL Enterprise Monitor, Advisors
• MySQL Consultative Support • MySQL Enterprise High Availability
… queries lentas, custosas? … política de segurança, muda?
• MySQL Enterprise Monitor, Query Analyzer
• MySQL External Authentication
… onde, quando, como “tunar”? • MySQL Enterprise Monitor, Security Advisor
• MySQL Enterprise Monitor, Advisors, Query Analyzer
• MySQL Consultative Support
… produtividade de desenv./QA?
• MySQL Workbench SE
• MySQL Enterprise Monitor, Query Analyzer
… problemas de replicação?
• MySQL Enterprise Monitor, Replication Monitor … qual versão do MySQL rodar?
• Oracle Premier 7x24 Support • Oracle Premier 7x24 Support
… os sistemas escalarão? … posso recuperar?
• MySQL Enterprise Scalability
• MySQL Enterprise Backup
• MySQL Enterprise Monitor, Advisors, Query Analyzer
• MySQL Consultative Support
44. Obrigado!
Time MySQL Brasil
marcos.trujillo@oracle.com marcelo.t.souza@oracle.com ana.guiselini@oracle.com airton.lastori@oracle.com
@MySQLBR meetup.com/MySQL-BR
Notes de l'éditeur
Ext/mysqlOne of the first PHP extensionsActively maintained with PHP 4No new features in PHP 5Exception: Added mysqlnd support with PHP 5.3Bug fixing onlyBest documented database extensionTons of books, tutorials, …Missing support for many MySQL featuresPrepared statements, Queries with multiple result sets (stored procedures), compression, encryption, full charset support, …mysqliFull support for all MySQL featuresStored ProceduresPrepared StatementsEncryption (SSL)CompressionCharsets…Actively developed, maintained and supported by Oracle PDO_mysql“The PHP Data Objects (PDO) extension defines a lightweight, consistent interface for accessing databases in PHP.” http://php.net/intro.pdoLowest common denominatorPHPish APIPDO is emulating prepared statements by default$pdo->setOption(PDO::MYSQL_ATTR_DIRECT_QUERY, false);
Ext/mysqlOne of the first PHP extensionsActively maintained with PHP 4No new features in PHP 5Exception: Added mysqlnd support with PHP 5.3Bug fixing onlyBest documented database extensionTons of books, tutorials, …Missing support for many MySQL featuresPrepared statements, Queries with multiple result sets (stored procedures), compression, encryption, full charset support, …mysqliFull support for all MySQL featuresStored ProceduresPrepared StatementsEncryption (SSL)CompressionCharsets…Actively developed, maintained and supported by Oracle PDO_mysql“The PHP Data Objects (PDO) extension defines a lightweight, consistent interface for accessing databases in PHP.” http://php.net/intro.pdoLowest common denominatorPHPish APIPDO is emulating prepared statements by default$pdo->setOption(PDO::MYSQL_ATTR_DIRECT_QUERY, false);
Database Design Visual Design, modeling Forward/Reverse Engineer Schema validation, Schema doc SQL DevelopmentSQL Editor - Color Syntax Highlighting Objects - Import/Export, Browse/EditConnections - Wizard, SSH TunnelDatabase AdministrationStatus, Configuration, Start/StopUsers, Security, SessionsImport/Export Dump FilesScripting & Plug-in SupportUI Designed to match VS 2010
MySQL External AuthenticationMySQL Thread Pool
Rapid Connection HandlingMySQL offers a specialized internal thread/connection cache that very quickly establishes incoming new connections and efficiently terminates existing connections upon request. The MySQL connection pool service new customer requests so no overhead is wasted on building new connections from scratch. This means that connecting to and disconnecting from the MySQL Database does not incur a performance penalty.ol always has new threads at the ready to