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:
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
Coloque a pasta locaweb na respectiva hospedagem.
Acesse o link onde está os arquivos. (ex: http://www.seudominio.com.br/locaweb).
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.
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, …)
Em “Nome verdadeiro”, você opta pela listagem dos nomes reais, tanto das tabelas como dos campos:
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.
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; } } <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
- Definir ou alterar a senha do MySQL
- Informações de acesso ao banco MySQL
- Bases MySql no plano Premium
- Scripts de conexão ao MySQL
- Como restaurar um arquivo .SQLno banco MySQL via phpMyAdmin
- Como restaurar um arquivo .SQL no banco MySQL via SSH
- Criando usuários adicionais no MySQL
- Posso utilizar tabelas temporárias no MySQL?
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
- Clientes dos planos abaixo com Gerenciamento pela Locaweb podem solicitar estas alterações criando um chamado no Help Desk
- Servidores Dedicados -> Servidores Dedicados
- Cloud Server Pro -> Cloud Server Pro
- Gestão Personalizada -> Gestão Personalizada
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
- Definir ou alterar a senha do MySQL
- Trigger
- Como efetuar um Backup do banco MySQL via SSH
- Informações de acesso ao banco MySQL
- Stored procedures
- Criação de índice no mysql
- Resolvendo problemas de caracteres acentuados no MySQL