Teste de conexão e desempenho de banco de dados mysql

Teste de conexão e desempenho de bancos de dados MySQL

Este pequeno aplicativo tem o objetivo de fazer um simples teste de desempenho em banco de dados mysql.

O seu funcionamento limita-se a lista todas os nomes de todas as tabelas e/ou os campos desses tabelas, permitindo que você liste, ou o nome dessas tabelas/campos, ou a eunumeração dos mesmos (tabela1, tabela2, etc.. / campo1, campo2, etc), executando o teste quantas vezes julgar necessário e ao final obter o tempo (em segundos) que o aplicativo levou para executar a tarefa. Você pode ainda exibir ou enibir a listagem das tabelas e/ou campos.

É algo bem simples, mas creio que pode auxiliar os cliente a testarem de forma rápida a conexão e o desempenho do banco de dados MySQL, interna ou extermamente, em ambas plataformas.

Para fazer o teste, siga estas instruções:

Teste de conexão e desempenho de banco de dados mysql Crie os arquivos index.html e fazteste.php com o código que está no final da wiki e coloque-os na pasta chamada locaweb. #Código Fonte

Teste de conexão e desempenho de banco de dados mysql Coloque a pasta locaweb na respectiva hospedagem.

Teste de conexão e desempenho de banco de dados mysql Acesse o link onde está os arquivos. (ex: http://www.seudominio.com.br/locaweb).

Teste de conexão e desempenho de banco de dados mysql Aparecerá a seguinte tela:

Teste de conexão e desempenho de banco de dados mysql

Teste de conexão e desempenho de banco de dados mysql Nos campos servidor e usuário, você deve colocar o nome do servidor ou o ip e o login do banco de dado conforme a figura abaixo.

Teste de conexão e desempenho de banco de dados mysql

Teste de conexão e desempenho de banco de dados mysql Em “listar tabela” e “listar campos”, uma vez selecionados, será listado todas as tabelas e os seus respectivos campos, ambos de forma numerada (tabela1, campo1, campo2, … tabela2, campo1, campo2, …)

Teste de conexão e desempenho de banco de dados mysql

Teste de conexão e desempenho de banco de dados mysql Observe o resultado:

Teste de conexão e desempenho de banco de dados mysql

Teste de conexão e desempenho de banco de dados mysql Em “Nome verdadeiro”, você opta pela listagem dos nomes reais, tanto das tabelas como dos campos:

Teste de conexão e desempenho de banco de dados mysql

Teste de conexão e desempenho de banco de dados mysql Veja o resultado:

Teste de conexão e desempenho de banco de dados mysql

Teste de conexão e desempenho de banco de dados mysql Em “Número de Execuções do Teste” você define quantas vezes o teste será executado. Essa opção ajuda a ter um tempo mais mensurável, já que a execução de teste apenas uma vez, traz um valor de tempo muito pequeno.

Teste de conexão e desempenho de banco de dados mysql Ao final do teste é mostrado o tempo total que o script levou para ser executado em segundos.

Código do arquivo index.php

Código Fonte

index.php

<html>      <head>      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">           <title>[PHP] Teste de desempenho de banco de dados</title>           <style>           .x {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:smaller;}           .y {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:xx-small;}           </style>      </head>      <body>
          <script language="Javascript"> 
              function validaForm(){                       d = document.testemysql;                       //validar host                       if (d.host.value == ""){                                   alert("O campo " + d.host.name + " deve ser preenchido!");                                   d.host.focus();                                   return false;                         }                            //validar login                       if (d.login.value == ""){                                   alert("O campo " + d.login.name + " deve ser preenchido!");                                   d.login.focus();                                   return false;                         }                            //validar senha                       if (d.senha.value == ""){                                   alert("O campo " + d.host.senha + " deve ser preenchido!");                                   d.senha.focus();                                   return false;                         }                            //validar repetir                       if (d.repetir.value == ""){                                   alert("O campo Numero de Execuções de Teste deve ser preenchido!");                                   d.repetir.focus();                                   return false;                         }                    } 

</script>

          <h2>Teste simples de desempenho de banco de dados MySQL</h2>           <form class="x" name="testemysql" action="fazteste.php" method="post" onSubmit="return validaForm()">                <p class="x">Dados do servidor<br>                <table border="0">                     <tr>                          <td class="x">Servidor: </td>                          <td><input class="x" type="text" name="host" id="host"></td>                     </tr>                     <tr>                          <td class="x">Usuario: </td>                          <td><input class="x" type="text" name="login" id="login"></td>                     </tr>                     <tr>                          <td class="x">Senha: </td>                          <td><input class="x" type="password" name="senha" id="senha"></td>                     </tr>                     <tr>                          <td class="y">Lista Tabelas?: </td>                          <td><input class="x" type="checkbox" size="20" name="listaTabela" id="listaTabela"></td>                          <td class="y">Nome Verdadeiro?: </td>                          <td><input class="x" type="checkbox" name="nomeTabelaVerdadeiro" id="nomeTabelaVerdadeiro"></td>                     </tr>                     <tr>                          <td class="y">Lista Campos?: </td>                          <td><input class="x" type="checkbox" name="listaCampo" id="listaCampo"></td>                          <td class="y">Nome Verdadeiro?: </td>                          <td><input class="x" type="checkbox" name="nomeCampoVerdadeiro" id="nomeCampoVerdadeiro"></td>                     </tr>                     <tr>                          <td class="x">Numero de Execuções do Teste: </td>                          <td><input class="x" type="text" name="repetir" id="repetir"></td>                     </tr>                </table>                <div class="x">                     <input class="x" type="submit" value="enviar">                </div>           </form>      </body> </html>

fazteste.php

<?php   // Criamos a função que fará os cálculos atravéz do comando microtime() do PHP $tempo = null; function execucao(){      $sec = explode(" ",microtime());     $tempo = $sec[1] + $sec[0];     return $tempo;    }   // No inicio da página executamos a função para iniciar o calculo, gerando a variavel $inicio $inicio = execucao();        //echo "hora de inicio: ".$Time->TempoInicialParcial;        $host = $_POST["host"];      $login = $_POST["login"];      $senha = $_POST["senha"];        if(isset($_POST["listaTabela"])) {                $listaTabela =1;           }  else  {                $listaTabela = 0;           }        if(isset($_POST["nomeTabelaVerdadeiro"])) {                $nomeTabelaVerdadeiro =1;           }  else  {                $nomeTabelaVerdadeiro = 0;           }        if(isset($_POST["listaCampo"])) {                $listaCampo =1;           }  else  {                $listaCampo = 0;           }        if(isset($_POST["nomeCampoVerdadeiro"])) {                $nomeCampoVerdadeiro =1;           }  else  {                $nomeCampoVerdadeiro = 0;           }                  $repetir = $_POST["repetir"];          $repeticao = 0;     while ($repeticao < $repetir) {           $link = null;           $result = null;           $tabelas = null;           $result1 = null;           $row = null;             $link = mysql_connect($host, $login, $senha)or die("Falha ao se conectar ao banco. Verifique se os dados de conexão estão corretos.");;            if (!$link) {                echo 'Nao foi possivel conectar: '. mysql_error() . '<br>';                exit;           } else {                echo 'Conectado ao banco '. $login. ' no servidor '.$host. ' <br>';           }             $dbname = $login;           mysql_select_db($dbname, $link);             $sql = "SHOW TABLES FROM $dbname";           $result = mysql_query($sql);             if (!$result) {                echo "DB Error, could not list tables/n";                echo 'MySQL Error: ' . mysql_error();                exit;           }  /*else {                echo 'tabela - consulta realizada com sucesso <br><br>';           } */             $contar = 0;           while ($tabelas = mysql_fetch_row($result)) {                //echo "Tabela: {$tabelas[0]}/n <br>";                $contar++;                if ($listaTabela == 1) {                     if ($nomeTabelaVerdadeiro == 0) {                          echo "Tabela: ".$contar."<br>";                          } else {                          echo "Tabela: {$tabelas[0]} <br>";                          }                }                  $result1 = mysql_query('SHOW COLUMNS FROM `'.$tabelas[0].'`');                 if (mysql_num_rows($result1) > 0) {                     $contar1 = 0;                           while ($row = mysql_fetch_assoc($result1)) {                                //print '<span>'.$row['Field'].'</span><br />';                                $contar1++;                          if ($listaCampo == 1) {                               if ($nomeCampoVerdadeiro == 0) {                                    print '<span>Campo: '.$contar1.'</span><br />';                                } else {                                    print '<span>'.$row['Field'].'</span><br />';                               }                          }                     }                if ($listaTabela || $listaCampo) {                     echo "<br>";                      }                }            }           mysql_close($link);           $repeticao++;           echo "execução numero: ". $repeticao;           echo "<br>";      }       // Após a execução da página, geramos a variavel $fim, que nos dará o tempo final da execução da página $fim = execucao();   // Agora é só fazermos a subtração de um pelo outro, e usar o number_format() do PHP para formatar com 6 casas depois da virgula e pronto, mas caso você queira alterar esse número de casas depois da vírgula para mais ou menos, fique a vontade $tempo = number_format(($fim-$inicio),6);   // Agora á só imprimir o resultado print "Tempo de Execução: <b>".$tempo."</b> segundos";   ?>

Veja também


Listando todas as variáveis do MySQL

Com a query abaixo você consegue visualizar, por exemplo, quantas conexões seu usuário pode fazer (max_user_connection) e qual o tamanho máximo de um arquivo (casos de campos do tipo BLOB) a ser enviado (max_allowed_packet).


 SHOW VARIABLES;

É possível filtrar os nomes das variáveis também, por exemplo:


 SHOW VARIABLES LIKE '%connection%';

    Alterando valores de uma variável

    Em alguns casos é possível que se altere o valor de uma variável, mas a alteração será válida somente para a sessão (conexão) atual. Quando você abrir uma outra conexão ou desconectar e conectar novamente, a nova conexão sempre carregará os valores padrões.

    Sintaxe da query de alteração:


     SET nome_da_variavel = novo_valor;

    Exemplo:


     SET table_type = InnoDB;

    • Este exemplo altera o padrão das tabelas a serem criadas de MyISAM (padrão Locaweb) para InnoDB.

    Para saber se uma variável pode ser alterada, ou se ela foi alterada (baseada no exemplo acima), rode:


     -- Veja primeiro o valor atual da variável.  SHOW VARIABLES LIKE 'table_type';    -- Altere para o valor desejado.  SET table_type = InnoDB;    -- E veja novamente o valor da variável.  SHOW VARIABLES LIKE 'table_type';

    • Não são todas as variáveis que podem ser alteradas, as que exigem um SET GLOBAL somente o usuário ‘root’ ou outro com mais privilégios terá condições de alterá-la.
    • A Locaweb não altera o valor das variáveis globais no servidor (as que exigem SET GLOBAL), pois impactará diretamente nas outras bases que estão sob o mesmo servidor

    Para verificar quais variáveis são de sessão acesse:

    http://docs.oracle.com/cd/E17952_01/refman-5.1-en/mysqld-option-tables.html

    Visualizando as conexões ativas

    A query que fará você visualizar as conexões do seu usuário ativas será


     SHOW PROCESSLIST;

    Ela retornará valores como PID (número do processo da conexão), a quantidade de conexões do seu usuário à base, a query que a conexão está rodando no momento ou se ela está ociosa (sleep).

    Derrubando conexões e processos presos

    Caso se depare com problemas de conexão presa, ou seu usuário esteja usando todas as conexões disponíveis para ele, a query abaixo derrubará a conexão que você escolher:

    Sintaxe:


     KILL <numero_PID>;

    • O PID você obtém rodando SHOW PROCESSLIST (exemplo do tópico anterior).

    Exemplo:


     KILL 2552;

    Veja também