segunda-feira, 6 de maio de 2013

Como identificar MySQL consultas lentas e preocupações relacionadas

Original post: http://anothermysqldba.blogspot.com/2013/05/how-to-identify-mysql-slow-queries-and.html

Este blog é parte da série de posts 

O que faz o log de consultas lentas dizer? Será que inclui consultas para a sua aplicação?

Há quanto tempo o servidor MySQL executado consultas neste estado?
Tem sido sempre lento ou essas consultas funcionou muito bem até algumas semanas atrás?
O que mudou, se alguma coisa?

Você começa também seguindo algumas orientações por Shlomi Noach .
Ele tem algumas consultas úteis listados neste post do blog.
    • "A consulta a seguir retorna o tamanho total por motor por banco de dados." Shlomi Noach.
    • "Veja se algum índice é um prefixo de outro (caso em que é redundante)" - Shlomi Noach.
    •  "Veja se quaisquer dois índices são idênticos" - Shlomi Noach.
Também gostaria de sugerir a compreensão dos conceitos e ferramentas mostrada no post de Ronald

Então, vamos cavar um pouco mais sobre o problema de consultas lentas.

Este é um exemplo simples para que seus resultados podem variar.

Primeiro reunir alguns números:

% De consultas lentas
     Apenas dados de demonstração para os seus resultados irão variar. 
show status like 'Slow_queries';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Slow_queries | 7 |
+---------------+-------+

show status like 'Questions';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Questions | 84 |
+---------------+-------+
1 row in set (0.01 sec)

SELECT (7 / 84) * 100 as "% Slow Queries";
+----------------+
| % Slow Queries |
+----------------+
| 8.3333 |
+----------------+ 

slow_query_log
Reúna a localização, que o DBA em tempo integral já deve saber, mas apenas no caso de:
show variables like '%slow_query%';
+---------------------+-------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/mysql-slow.log |
+---------------------+-------------------------------+
2 rows in set (0.00 sec) 

Comece a olhar sobre estas consultas e funcionando explica para ver o que poderia ser o problema.
Se você quiser, pode rever algumas ferramentas para ajudar.
"Caminhos diferentes, por vezes, levam ao mesmo castelo."
George RR Martin , A Game of Thrones

"Alguém que só lê jornais e na melhor das hipóteses livros de autores contemporâneos olha para mim como uma pessoa extremamente míope que despreza óculos. Ele é completamente dependente dos preconceitos e modas de seu tempo, já que ele nunca chega a ver ou ouvir qualquer outra coisa. " 
Albert Einstein

Para obter os melhores resultados, use mais de uma dessas ferramentas e garantir que você obtenha o retrato grande e entender o que está sendo apresentado a você.
    Depois de encontrar as consultas que são depois, é preciso avaliá-los com EXPLAIN. Então você vai ter as informações necessárias para ajudá-lo a otimizar os índices de consulta e relacionada, se necessário.
    Mais informações sobre a explicar pode ser encontrado abaixo:

    Algumas preocupações adicionais para ajudar o desempenho da consulta.

    Eficiência Cache de Consultas
    Apenas dados de demonstração para os seus resultados irão variar. 

    > SELECT @@have_query_cache;
    +--------------------+
    | @@have_query_cache |
    +--------------------+
    | YES |
    +--------------------+


    >show status like '%Qcache_hits%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Qcache_hits | 32 |
    +---------------+-------+
    1 row in set (0.00 sec)

    > show status like '%Com_select%';
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | Com_select | 16 |
    +---------------+-------+
    1 row in set (0.00 sec)

    > SELECT ( 32 / (16 + 32) ) * 100 AS "Query Cache Efficiency";
    +------------------------+
    | Query Cache Efficiency |
    +------------------------+
    | 66.6667 |
    +------------------------+
    1 row in set (0.00 sec) 

    Eu não quero reescrever o que Pedro já escreveu para consultar seus posts .
    Avaliar a eficiência do seu cache de consultas é. Como determinista são as suas dúvidas?

    Junta que precisa de um índice
    Apenas dados de demonstração para os seus resultados irão variar.   
    > show status like '%Select_range_check%';
    +--------------------+-------+
    | Variable_name | Value |
    +--------------------+-------+
    | Select_range_check | 0 |
    +--------------------+-------+

    > show status like '%Select_full_join%';
    +------------------+-------+
    | Variable_name | Value |
    +------------------+-------+
    | Select_full_join | 1 |
    +------------------+-------+

    > SELECT (0 + 1) AS "# of Joins that need an index";

    #
    This is used below as the numerator in
    "# of Joins that need an index today"
    +-------------------------------+
    | # of Joins that need an index |
    +-------------------------------+
    | 1 |
    +-------------------------------+

    > show status like 'Uptime';
    +---------------+--------+
    | Variable_name | Value |
    +---------------+--------+
    | Uptime | 335243 |
    +---------------+--------+

    > SELECT (1/ (335243/86400 )) as " # of Joins that need an index today" ;
    +-------------------------------------+
    | # of Joins that need an index today |
    +-------------------------------------+
    | 0.2577 |
    +-------------------------------------+ 

    Esperamos que você possa avaliar as consultas lentas encontrados com o log, bem como rever a sua eficiência do cache de consulta, bem como encontrar a junta que precisa de um índice de tudo a partir do "select @ @ slow_query_log_file";

    Esperemos que este tenha chegado a começar a resolver um problema muito antigo no MySQL.