A rede toda a abrangente prática de otimização de desempenho MySQL mais, programador batalha frases essenciais! ! !

Uma inscrição

Recentemente, a empresa projeta para adicionar novos recursos na linha depois de um longo tempo de encontrar uma lista de algumas funções de consulta. A razão é um novo recurso para usar a interface função de idade, e as interfaces de consulta SQL associadas a estas tabelas velhas 5,6 e escrita não é padronizado, resultando em falha do MySQL índice na implementação das instruções SQL, uma varredura completa da tabela. Originalmente responsável por otimizar colegas algo para deixar para ir para casa, otimizando assim o problema de dados de consulta cai nas mãos do autor. O autor após a informação on-line Otimização de acesso SQL resolvido com sucesso o problema, para isso de um ponto de vista global, ficha e resumir técnicas de otimização de consulta MySQL relevantes.

Em segundo lugar, as ideias de otimização

Dados de consultas lentas, não significa que instrução SQL escrita em questão. Primeiro, precisamos encontrar a fonte do problema, "o remédio certo." Use um fluxograma que mostra ideias de otimização MySQL:

A rede toda a abrangente prática de otimização de desempenho MySQL mais, programador batalha frases essenciais!  !  !

 

Sem outras palavras pode ser claramente visto na figura, resultando em dados lentos consultar uma variedade de razões, tais como: invalidação de cache, dentro deste período de tempo, devido aos elevados leads acesso simultâneo a um servidor MySQL a falhar; instruções SQL problema de escrita; servidor MySQL parâmetros do problema; limitações de configuração de hardware do MySQL problemas de desempenho de serviços.

Em terceiro lugar, visualizar o status do servidor MySQL está rodando valor

Se o número de solicitações simultâneas do sistema não é alta, ea consulta é lento, este passo pode ser omitido ajustar instruções SQL diretamente etapa.

Executar o comando:

show status

Desde o retorno muitos resultados, onde os resultados não são publicados. Entre eles, os resultados de volta, vamos nos concentrar no valor de "Consultas", "Threadsconnected" e "Threadsrunning", ou seja, o número de inquéritos, conexões de rosca e o número de threads em execução.

Podemos executar o seguinte script para servidor do monitor MySQL está em execução valor de estado

#!/bin/bash
while true
do
mysqladmin -uroot -p"密码" ext | awk '/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}' >> status.txt
sleep 1
done

Executar o script por 24 horas para obter Status.txt no conteúdo, mais uma vez o número de solicitações por serviços segundo MySQL == == calculado pela awk

awk '{q=$1-last;last=$1}{printf("%d %d %d\n",q,$2,$3)}' status.txt

A cópia teor calculado para Excel gráfico gerado observada periodicamente dados.

Se as mudanças cíclicas observada dados, como na FIG necessidade interpretação para modificar a política de invalidação de cache.

Por exemplo:

Em [3,6,9] em que o número aleatório adquirida pelo valor do intervalo como um tempo de um erro de cache, a expiração do cache de modo disperso, poupando, assim, uma porção de consumo de memória.

Ao acessar o pico da parte de divisão do pedido a uma falha de cache, a outra parte é um acesso de banco de dados MySQL, reduzindo assim o servidor MySQL pressão.

Em quarto lugar, a necessidade de obter instruções SQL otimizadas

4.1 Método 1: Ver o fio condutor

Executar o comando:

show processlist

resultado de retorno:

mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
|  9 | root | localhost | test | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)

A partir dos resultados retornados, podemos entender o que o thread em execução o / instruções SQL comando e execução tempo. aplicação prática, a consulta retorna um resultado haverá N registros.

Entre eles, o valor de retorno do Estado é a chave para o juiz bom ou mau desempenho , suas aparece valor seguinte, as linhas precisam otimizar a instrução SQL:

Converting HEAP to MyISAM # 查询结果太大时,把结果放到磁盘,严重
Create tmp table #创建临时表,严重
Copying to tmp table on disk  #把内存临时表复制到磁盘,严重
locked #被其他查询锁住,严重
loggin slow query #记录慢查询
Sorting result #排序

4.2 forma: ativar log de consultas lentas

No my.cnf arquivo de configuração no [mysqld] adicione a seguinte linha de dois parâmetros:

slow_query_log = 1
slow_query_log_file=/var/lib/mysql/slow-query.log
long_query_time = 2

log_queries_not_using_indexes = 1

Onde, slowquerylog = 1 indica que deve rodar consulta lenta; slowquerylogfile representa lenta local de armazenamento de log consulta; longquerytime = 2 indica que a consulta> = 2 segundos antes do log; logqueriesnotusing_indexes = 1 gravação não usar a instrução índice de SQL.

Nota: O slowquerylog_file caminho pode não apenas escrever, caso contrário ele pode não ter permissão para arquivos de log do servidor MySQL escritos para o diretório especificado. caminho recomendado copiado diretamente acima.

Depois de modificar salvar o arquivo, reinicie o serviço MySQL. Ele cria um arquivos de log slow-query.log em / var / lib / mysql / diretório. Conectando a um servidor MySQL pode executar o seguinte comando para exibir a configuração.

show variables like 'slow_query%';

show variables like 'long_query_time';

Testar log de consultas lentas:

mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.00 sec)

Abra o arquivo de log de consultas lentas

[root@localhost mysql]# vim /var/lib/mysql/slow-query.log
/usr/sbin/mysqld, Version: 5.7.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2017-10-05T04:39:11.408964Z
# User@Host: root[root] @ localhost []  Id:     3
# Query_time: 2.001395  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use test;
SET timestamp=1507178351;
select sleep(2);

Podemos ver apenas dois segundos para executar uma instrução SQL para ser gravado.

Embora o registro de informações de consulta SQL lenta no log de consultas lentas, mas os registros de log de intenso e difícil de ver. Portanto, precisamos filtrar através da ferramenta SQL.

MySQL fornece mysqldumpslow  ferramenta para análise de log . Podemos usar mysqldumpslow comando help para exibir o uso relevante.

parâmetros comuns são os seguintes:

    -s:排序方式,后边接着如下参数
        c:访问次数
        l:锁定时间
        r:返回记录
        t:查询时间
    al:平均锁定时间
    ar:平均返回记录书
    at:平均查询时间
    -t:返回前面多少条的数据
    -g:翻遍搭配一个正则表达式,大小写不敏感

caso:

获取返回记录集最多的10个sql
mysqldumpslow -s r -t 10 /var/lib/mysql/slow-query.log

获取访问次数最多的10个sql
mysqldumpslow -s c -t 10 /var/lib/mysql/slow-query.log

获取按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow-query.log

 

V. Análise de instruções SQL

5.1 Método 1: explicar

Exibido SQL problemático, podemos usar o fornecido explicar caso MySQL Ver SQL plano de execução (tabela de associação, a sequência de consulta de tabela, a utilização do índice, etc.).

uso:

explain select * from category;

resultado de retorno:

mysql> explain select * from category;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | category | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

Campos explicou: 1) id: selecionar o número de sequência de consulta. O mesmo id, a ordem de execução de cima para baixo; id diferente, quanto maior o valor ID de maior prioridade, o primeiro a ser executado

2) select_type: tipo de dados de consulta de funcionamento, que os valores são os seguintes:

  • simples: uma consulta simples, não contém sub-consultas ou união
  • primária: conter sub-consultas complexas, as marcas de consulta ultraperiféricas para o valor
  • subconsulta: ou em que as seleccione subconsultas compreendendo, este valor é rotulado
  • derivada: sub-consulta incluído na lista são marcadas a partir deste valor, o MySQL irá recursivamente esses sub-consultas, os resultados em uma tabela temporária
  • União: se o segundo aparecer, selecione após a União, foram marcados para esse valor. Se a união incluída na sub consulta a partir da camada exterior é rotulado seleccione derivado
  • resultado da união: obter resultados da tabela união seleccionar

3) tabela: exibir os dados linha na qual tabelas

4) partições: uma partida de partição

5) tipo: o tipo de tabela de ligação, o seu valor, as seguintes propriedades no final de uma ordem elevada:

  • sistema: a tabela tem apenas uma linha, correspondente às tabelas do sistema
  • const: uma vez através do índice para encontrar apenas uma linha de correspondência de dados
  • eq_ref: índice exclusivo scan, para cada chave de índice, apenas um registro no jogo mesa. Comumente usado na verificação de índice de chave ou única preliminar
  • ref: não-exclusivo digitalização índice, retorna todas as linhas que correspondem a um valor separado. A =, operador <ou> indexados colunas
  • intervalo: somente obtém uma linha de uma dada gama, utilizando um índice para seleccionar as linhas. Geralmente usado entre,>, <situação
  • index: somente a travessia índice de árvore
  • ALL: varredura completa da tabela, o pior desempenho

Nota: Os primeiros cinco casos são o uso de índice de situação ideal. Normalmente otimizado pelo menos até o intervalo de nível, é melhor para otimizar o árbitro

6) possible_keys: MySQL indicar qual índice para uso nesta tabela para encontrar as linhas. Se o valor for NULL, você não usar a descrição do índice podem ser indexados para melhorar o desempenho

7) Tecla: Exibe o MySQL índice realmente utilizados. Se NULL, então não use a consulta de índice

8) key_len: número de bytes usados ​​no índice, o referido índice usado na consulta é calculado pelo comprimento da coluna. Sem perda de precisão, menor o comprimento, melhor a visualização é o comprimento máximo do campo de índice, e não o comprimento real

9) ref: exibe os campos de índice associados à tabela que campos de quais tabelas

10) linhas: as estatísticas da tabela de seleção e caso, uma estimativa aproximada do número de linhas necessárias para localizar a gravação desejada ou leitura, quanto menor o valor, melhor

11) filtrada: a porcentagem do número de linhas retornadas resultados representam o número de linhas de leitura, melhor será o valor

12) Extra: conter inapropriado exibido nas outras colunas, mas informações adicionais é muito importante, valores comuns são os seguintes:

  • usando filesort: MySQL será descrito utilizando um índice de pedidos de dados externos, em vez de ler a ordem de índice na tabela. O surgimento de valor, deve ser otimizado SQL
  • usando temporária: o uso de uma tabela temporária para armazenar resultados intermediários, MySQL usar tabelas temporárias ao classificar os resultados da consulta. Comum, a fim de ordenação e agrupamento consulta GROUP BY. O surgimento de valor, deve ser otimizado SQL
  • usando índice: representado por uma escolha operações utilizando o índice coberto, para evitar linhas da tabela de acesso de dados correspondente, boa eficiência
  • usando que: em que restringe cláusula que linha
  • usando join tampão: Use o cache de conexão
  • distinta: o primeiro encontrar um minucioso jogo, parada para a combinação de registro atual de mais linhas

Nota: antes do advento dos dois valores, instruções SQL deve ser otimizado.

5.2 A segunda maneira: profiling

Use o comando de perfil para saber mais informações sobre instruções SQL estão consumindo recursos (custo de cada etapa da execução).

5.2.1 Visualizando caso perfil aberto

select @@profiling;

resultado de retorno:

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           0 |
+-------------+
1 row in set, 1 warning (0.00 sec)

0 representa fora, por sua vez, representa um

5.2.2 Ativar perfil

set profiling = 1;  

resultado de retorno:

mysql> set profiling = 1;  
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           1 |
+-------------+
1 row in set, 1 warning (0.00 sec)

Após a conexão é fechada, estado de perfil é definido automaticamente para o estado fechado.

Veja uma lista de SQL executado 5.2.3

show profiles;

resultado de retorno:

mysql> show profiles;
+----------+------------+------------------------------+
| Query_ID | Duration   | Query                        |
+----------+------------+------------------------------+
|        1 | 0.00062925 | select @@profiling           |
|        2 | 0.00094150 | show tables                  |
|        3 | 0.00119125 | show databases               |
|        4 | 0.00029750 | SELECT DATABASE()            |
|        5 | 0.00025975 | show databases               |
|        6 | 0.00023050 | show tables                  |
|        7 | 0.00042000 | show tables                  |
|        8 | 0.00260675 | desc role                    |
|        9 | 0.00074900 | select name,is_key from role |
+----------+------------+------------------------------+
9 rows in set, 1 warning (0.00 sec)

Antes que o comando é executado, as instruções SQL só precisa executar a gravação adicional.

5.2.4 Consultas ID detalhes de execução especificado

show profile for query Query_ID;

resultado de retorno:

mysql> show profile for query 9;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000207 |
| checking permissions | 0.000010 |
| Opening tables       | 0.000042 |
| init                 | 0.000050 |
| System lock          | 0.000012 |
| optimizing           | 0.000003 |
| statistics           | 0.000011 |
| preparing            | 0.000011 |
| executing            | 0.000002 |
| Sending data         | 0.000362 |
| end                  | 0.000006 |
| query end            | 0.000006 |
| closing tables       | 0.000006 |
| freeing items        | 0.000011 |
| cleaning up          | 0.000013 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

Cada linha é um processo de mudança de estado, bem como a sua duração. Status do presente coluna e mostrar processlist de Estado é o mesmo. Portanto, a atenção precisa ser otimizado nos mesmos pontos como descrito acima.

5.2.5 obter CPU, Bloco IO e outras informações

show profile block io,cpu for query Query_ID;

show profile cpu,block io,memory,swaps,context switches,source for query Query_ID;

show profile all for query Query_ID;

Sexto, métodos de otimização

Principalmente em consulta otimização, indexação e estrutura de tabela usando o projeto de explicar.

6.1 Consulta Otimização

1) Evite SELECT *, quais os dados necessários, ele consulta o campo correspondente.

2) induzido por tabela pequena grande mesa, isto é pequeno conjunto de dados para conduzir grandes conjuntos de dados. Tais como: o A, B duas mesa, por exemplo, ao associar campo ID de duas tabela.

Quando B é menos do que um conjunto de tabela de dados de tabela, Optimization em exist; usadas em, dois quadros é realizada para verificar a sequência da Tabela B, Tabela A e, em seguida, verificar

select * from A where id in (select id from B)

Quando A é inferior a B tabela conjunto de dados da tabela, existir em Optimização; utilizando existe, duas tabelas é realizada para verificar a sequência do quadro A, Quadro B e, em seguida, verificar

select * from A where exists (select 1 from B where B.id = A.id)

3) Em alguns casos, a conexão pode ser usado em vez das sub-consultas, uma vez que o uso de participar, MySQL não irá criar uma tabela temporária na memória.

4) adicionado adequadamente um campo redundante, reduzir a tabela associada.

5) a utilização racional do índice (descrito abaixo). Tais como: a classificação, grupo, campos de índice, para evitar o filesort. Mais: índice MySQL para uma estrutura de dados e inventário optimizar

6.2 Use Index

6.2.1 para o uso do local do índice

1) chave primário cria automaticamente um índice exclusivo

2) frequência de campo como as condições de consulta

Campo 3) a consulta associada a outras tabelas

4) classificar o campo de consulta

5) campo de consulta ou grupo estatística

6.2.2 cenas que não são adequados para utilização índice

1) Campos atualizados com freqüência

2) com condições de campo em que menos do que

3) a tabela registra também

4) CRUD mesa regular

5) o valor do campo diferença ou pouco alta repetibilidade

6.2.3 princípios de criação de índice e de uso

1) consulta de tabela única: as colunas para a consulta, criar um índice na coluna

2) consultas multi-mesa: Quando você deixou entrar, o índice adicionado ao campo table-direito relacionado, quando o direito participar, o índice adicionado à tabela de correlação de-campo da esquerda

3) Não se realizar qualquer operação (cálculo, a conversão de tipo) índice de coluna

4) Não use a coluna do índice! =, <> Não-igual

5) do índice de coluna não está vazia, e não utilização é nulo ou não nulo é Analisar

6) O índice campo é um tipo de cadeia, a condição de consulta para aumentar o valor de 'plicas, escreva parte inferior para evitar a conversão automática

Contrária aos princípios acima podem resultar em falha do índice, as circunstâncias específicas precisam explicar comando para vê-lo

6.2.4 caso índice de falha

Além de violação dos princípios de criação de índices e utilização, nas seguintes circunstâncias pode levar a insuficiência do índice:

1) Quando o inquérito difusa, começando com%

2) quando se utiliza ou, tais como: campo 1 (não indexada) ou domínio 2 (índice) fará com que o índice de falha.

3) Quando se utiliza um índice composto, sem a utilização de uma primeira coluna de índice.

índice (a, b, c), para campo a, b, c como um índice composto, por exemplo:

A rede toda a abrangente prática de otimização de desempenho MySQL mais, programador batalha frases essenciais!  !  !

 

6.3.1 Selecione o tipo de dados apropriado estrutura de tabela de banco de dados 6.3 Projeto

1) A utilização é possível armazenar os dados de um tipo de dados mínimo

2) o uso de tipos de dados simples. tipo varchar int no processo de mysql do que simples

3) Faça uso tinyint, smallint, MEDIUMINT e não como tipo integral int

4) definem o campo tanto quanto possível utilizar não nulo, porque nulo ocupam 4 bytes de espaço

5) minimizar o uso do tipo de texto, não é aconselhável a considerar ao usar um não sub-table-

6) Tente usar em vez de datetime timestamp

7) Não tem muitos campo de tabela única, dentro do recomendado 20

6.3.2 Dividir tabela

Quando os dados no banco de dados é muito grande, consulta plano de otimização não vai resolver o problema de consultas lentas, podemos considerar mesas de divisão, cada tabela para que os dados torna-se pequeno melhorando assim a eficiência, consulta.

1) vertical Split: uma pluralidade de colunas na tabela são separados em diferentes tabelas. Por exemplo, alguns dos campos na tabela de utilizador é acessado frequentemente, estes campos de um quadro, um número de campos adicionais não utilizado em outra tabela. Ao inserir dados, usando transações para garantir a consistência dos dados de duas tabelas.

2) Horizontal Split: dividida em linhas. tabela utilizador, por exemplo, ID de utilizador, ID de utilizador para acesso mais do que 10, a distribuição uniforme dos dados de utilizador para o utilizador 10 na Tabela 0-9. Quando Encontre também consulta de dados de acordo com esta regra.

6.3.3 leitura e gravação separado

Em circunstâncias normais para o banco de dados são "write leitura menos." Em outras palavras, a pressão do banco de dados principalmente porque um grande número de operações para ler os dados causados. Podemos usar as soluções de cluster de banco de dados, usar a biblioteca principal, como uma biblioteca, é responsável pela gravação de dados; outra biblioteca da biblioteca, é responsável pela leitura de dados. Isso vai aliviar a pressão sobre o acesso ao banco de dados.

Sete, parâmetros de ajuste servidor

7.1 memória relacionada

sortbuffersize tipo tamanho do buffer de memória

tamanho do buffer usando o joinbuffersize conexão

Quando a varredura completa de tabela alocados buffer de tamanho readbuffersize

7,2 IO relacionado

tamanho do log de transações Innodblogfile_size

número Innodblogfilesingroup de logs de transação

Innodblogbuffer_size transacção tamanho do buffer de log

Innodbflushlogattrx_commit estratégia de renovação de log de transações, seus valores são os seguintes:

0: escrever a cada segundo cache de log, e log gravação para disco

1: apresentado ao cache de registo de escrita em cada transação, e log gravação para disco

2: Cada vez que uma transação for confirmada, os dados de log de execução gravados no cache, executar uma vez por segundo log gravação para disco

7.3 Segurança relacionadas com o

expirelogsdays especificar a limpeza automática do número de dias binlog

maxallowedpacket MySQL pode controlar o tamanho do pacote recebido

lookup skipnameresolve Disable DNS

read_only proibir permissão de escrita permissão usuário não-super

nível skipslavestart você usar recuperação automática escravo

7.4 Outro

O número máximo de ligações permitido pelas max_connections controle

tmptablesize tamanho da tabela temporária

maxheaptable_size tabela de tamanho máximo de memória

Eu não usar esses parâmetros para o ajuste de servidor MySQL, os resultados de desempenho e introduzir os detalhes específicos, consulte as informações no final do artigo, ou de outra forma Baidu.

Oito, compra de hardware e otimização de parâmetros

Desempenho do hardware determinar diretamente o desempenho do banco de dados MySQL. gargalos de desempenho de hardware, determina diretamente a eficiência dos dados operacionais e banco de dados MySQL.

Como um programador desenvolvedor de software, vamos nos concentrar no software de otimização de conteúdo para otimizar o hardware como você pode entender

8.1 memória relacionada

memória IO mais rápido do que um monte de disco rígido, você pode aumentar a capacidade do buffer do sistema, os dados de ficar mais tempo na memória para reduzir disco IO

8.2 Disk I / O relacionados com o

1) usando SSD ou dispositivo SSD pCLE, obter, pelo menos, várias centenas ou mesmo milhares de vezes de elevação IOPS

2) em simultâneo com a matriz de cartão de aquisição e módulo CACHE BBU, pode melhorar significativamente IOPS

3), na medida do possível selecção de RAID-10, RAID-5 em vez

8.3 Configuração CUP relacionado

No servidor de configuração da BIOS, ajustado como se segue:

1) Selecione o modo de desempenho por watt Optimized (DAPC), jogar o máximo desempenho da CPU

2) Fechar C1E C Unidos e outras opções, CPU aumentar a eficiência

3) Freqüência de memória (Memory Frequency) selecionada desempenho máximo

Publicado 239 artigos originais · ganhou elogios 48 · vê 30000 +

Acho que você gosta

Origin blog.csdn.net/Sqdmn/article/details/105014220
Recomendado
Clasificación