Testar o desempenho das consultas no mysql

Estou a tentar configurar um script que testaria o desempenho de consultas num servidor de desenvolvimento mysql. Aqui estão mais detalhes:

  • tenho acesso de raiz
  • Sou o único utilizador a aceder ao servidor.
  • principalmente interessado no desempenho InnoDB
  • As consultas que estou a otimizar são na maioria consultas de pesquisa.(SELECT ... LIKE '%xy%')
O que eu quero fazer é criar um ambiente de teste confiável para medir a velocidade de uma única consulta, livre de dependências de outras variavel.

até agora eu tenho usado SQL_ NO_CACHE, mas às vezes os resultados de tais testes também mostram comportamento de cache - levando muito mais tempo para executar na primeira execução e tendo menos tempo em corridas subsequentes.

Se alguém puder explicar este comportamento com todo o detalhe, posso continuar a usar SQL_NO_CACHE; acredito que possa ser devido à 'cache' do sistema de ficheiros e/ou 'Cache' dos índices usados para executar a consulta, como Este explica o post. Não é claro para mim quando Buffer Pool e Key Buffer ficam invalidados ou como eles podem interferir com os testes.

então, a não ser reiniciar o servidor mysql, como você recomendaria configurar um ambiente que fosse confiável para determinar se uma consulta funciona melhor do que a outra?

Author: Martin Vseticka, 2010-05-03

6 answers

Assumindo que você não pode otimizar a operação similar em si, você deve tentar otimizar a consulta base sem que eles minimizem o número de linhas que devem ser verificadas.

Algumas coisas que podem ser úteis para isso:

rows coluna em explicar seleccionar ... resultado. Então,

mysql> set profiling=1;
mysql> select sql_no_cache * from mytable;
 ...
mysql> show profile;
+--------------------+----------+
| Status             | Duration |
+--------------------+----------+
| starting           | 0.000063 |
| Opening tables     | 0.000009 |
| System lock        | 0.000002 |
| Table lock         | 0.000005 |
| init               | 0.000012 |
| optimizing         | 0.000002 |
| statistics         | 0.000007 |
| preparing          | 0.000005 |
| executing          | 0.000001 |
| Sending data       | 0.001309 |
| end                | 0.000003 |
| query end          | 0.000001 |
| freeing items      | 0.000016 |
| logging slow query | 0.000001 |
| cleaning up        | 0.000001 |
+--------------------+----------+
15 rows in set (0.00 sec)

Então,

mysql> FLUSH STATUS;
mysql> select sql_no_cache * from mytable;
...
mysql> SHOW SESSION STATUS LIKE 'Select%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| Select_full_join       | 0     |
| Select_full_range_join | 0     |
| Select_range           | 0     |
| Select_range_check     | 0     |
| Select_scan            | 1     |
+------------------------+-------+
5 rows in set (0.00 sec)

E outro valor interessante é last_query_cost, que mostra quão caro o Optimizador estimou a consulta (o valor é o número da Página aleatória leia):

mysql> SHOW STATUS LIKE 'last_query_cost';
+-----------------+-------------+
| Variable_name   | Value       |
+-----------------+-------------+
| Last_query_cost | 2635.399000 |
+-----------------+-------------+
1 row in set (0.00 sec)
A documentação do MySQL é tua amiga.
 54
Author: newtover, 2010-05-06 16:42:21

Citado de esta página: as opções SQL_ NO_ Cache afectam o caching dos resultados da pesquisa na 'cache' da pesquisa . Se a sua mesa é bastante pequena, é possível, que a própria mesa já está em cache. Uma vez que você apenas evitar caching dos resultados e não as tabelas você começa o comportamento descrito às vezes. Então, como dito nos outros postings, você deve lavar suas tabelas entre as consultas.

 2
Author: ablaeul, 2010-05-07 16:36:23

Como o artigo associado sugere, use FLUSH TABLES entre os testes para reiniciar o máximo que puder (nomeadamente a 'cache' da consulta).

Os seus testes não deveriam ter em conta que a própria InnoDB terá estados diferentes durante o desempenho real, de modo a interessar-se pelo desempenho agregado ao longo de vários ensaios? Quão "real" será o seu teste de desempenho se quiser reiniciar o InnoDB para cada ensaio? A consulta que você rejeita porque tem um mau desempenho imediatamente após reiniciar pode ser de longe a melhor consulta após InnoDB ter aquecido um pouco. Se fosse a ti, concentrava-me no que o Optimizador de consultas está a fazer separadamente do desempenho da InnoDB. Há muito escrito sobre como sintonizar InnoDB, mas ajuda a ter boas consultas para começar.

Você também pode tentar medir o desempenho com tabelas de MyISAM equivalentes, onde {[[0] } realmente irá reiniciá-lo para um ponto de partida quase idêntico.

Já tentou desligar o Cache da pesquisa ao todo? Mesmo com o SQL_ NO_CACHE, há cerca de 3% de penalidade apenas tendo o cache da consulta ligado.
 1
Author: David M, 2010-05-05 19:59:34

Já pensou em usarMaatkit ? Uma de suas capacidades que eu estou um pouco familiarizado é capturar dados da rede MySQL com tcpdump e processar o dump com {[[0]}. Esta ferramenta permite-lhe mostrar alguns detalhes finos sobre cada consulta. Mas há um monte de outras ferramentas que devem tornar a análise de consulta mais fácil.

 1
Author: Bram Schoenmakers, 2010-05-05 23:31:17

Você poderia tentar o MySQL workbench, eu pensei que ele tinha um monitor de declarações sql para que você possa ver quão rápido é e por que é rápido

 0
Author: Spidfire, 2010-05-05 19:42:53

As consultas de texto completo no InnoDB são lentas (como as declarações" %query%"), não há nada que possa fazer para as optimizar. As soluções variam de passagem, que determinada tabela que você está consultando para MyISAM, então você pode criar índices fulltext (que o innoDB não apoio), para denormalizing a linha em índices pesquisáveis (não recomendado), o Doctrine ORM fornece um exemplo fácil de como alcançar este : http://www.doctrine-project.org/documentation/manual/1_1/nl/behaviors:core-behaviors:searchable A solução "adequada" para o seu problema seria indexar a informação que você está usando pesquisas de texto completo, com uma solução como pesquisa Esfinge ou Apache Solr.

Como foi dito anteriormente, você deve considerar o estado de cache ao comparar os resultados, um cache carregado dá consultas extremamente performantes. Você deve considerar a porcentagem de acerto de cache de uma consulta particular, mesmo se for um consulta cara, se ele tem uma taxa de sucesso de cache de 99%, o desempenho médio será muito alto.

Afinar Finegrained das consultas não é uma bala de prata, você pode estar adicionando complexidade à sua aplicação para o bem de optimizações que em geral em um ambiente de produção, são desprezíveis.

Considere a sua carga de trabalho, resolução de problemas frequentes, consultas sem desempenho (use o slow_query_log no mysql, não comece cegamente a otimizar as consultas).

 0
Author: mhughes, 2010-05-05 20:11:03