Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia
Tenho um servidor com muitos acessos
Cada requisição faz 1 ou 2 selects que são leves, mas são muitas, algo em torno de 500 a cada 2 ou 3 segundos.
O servidor até que tem aguentado, é um windows com wamp.
Já configurei tudo certinho, e agora estou tentando ajustar detalhes na programação para melhorar ainda mais.
Minha duvida é....
Abro a conexão com mysql_connect ou mysql_pconnect (persistente)
Fechou sempre no final de cada arquivo ?
Devo usar mysql_free_result ?
Alguma outra dica?
vlw galera
Utilize também prepared statements, que possuem um melhor desempenho que apenas executar uma query.
Além disso, sempre que utilizar consultas em sequencia, lembre-se de fechar o cursor (mysqli_stmt::close ou PDOStatement::closeCursor) da consulta anterior.
Segundo alguns testes, MySQLi é um pouco mais rápida que PDO (mas é pouco mesmo, chega a ser insignificante). Entretanto, PDO é uma abstração para a utilização de vários SGBDs, se um dia houver a necessidade de uma migração, PDO te dará essa vantagem. Além do mais, não utilize conexões persistentes.
Também existe uma ordem do que pesa mais em cada consulta (joins, sub-select, group, having, etc). Mas como você comentou que são consultas leves, lhe darei o benefício da dúvida.
Legal
já esto mudando a aplicação para mysqli.. tem alguns detalhes que mudam, mas tudo certo
Agora... umas duvidas ainda persistem
Devo fechar a conexão no final de cada arquivo?
Devo mysqli_free_result, esse comando ajuda a liberar memoria, ou tornar tudo mais "leve"
Se você não está utilizando conexão persistente, ela é fechada automaticamente ao final da execução do script.
mysqli_free_result não é necessário utilizar pois ele é apenas uma chamada antecipada (diagamos assim) de liberação de memória, chamada a qual o garbage collector já realiza.
Legal
Comecei a usar mysqli, já mudei um sistema bem grande que construí, e tudo tá se caminhando.
Queria sair usando ele, mas de forma correta.. então abaixo mostro como to usando, me baseando no que busquei na internet.
Minha duvida: essa é a forma "correta", ou melhor forma de trabalhar com mysqli
// no arquivo de funções usado por todo sistema
function db_connect() {
$host = "localhost";
$dbname = "sistema";
$usuario = "root";
$password = "";
static $connection;
if(!isset($connection)) {
$connection = mysqli_connect($host,$usuario,$password,$dbname);
}
if($connection === false) {
return mysqli_connect_error();
}
return $connection;
}
function estoqueProduto($id){
$sql = mysqli_query(db_connect(), "select ..... ");
while($dados=mysqli_fetch_array($sql)){
return $dados[0];
}
}
Não deve ter segredo... tá tudo ok.. mas só quero confirmar...
vlw a força
Se usar Prepared Statements, seu sistema ficará mais rápido e mais seguro.
Usar a notação orientada a objetos vai te poupar um pouco de trabalho, sem precisar passar o link de conexão como parâmetro para outros funções
Então galera
Passei a usar o mysqli, mas a coisa ainda tá pesada, as vezes tem requisição que da timeout...
Um exemplo de sql mais usado
select * from s_msgs where (de = 79 and para = 91) or (de = 91 and para = 79) order by id asc limit 791, 70;
Sigo tentando eliminar coisas aqui, toda dica é bem vinda =)
O SELECT é simples. O tempo de execução deve ser alto por causa do número de registros na tabela. Qual é o total de registros dela? Verifique se há registros inúteis (lixo) e os remova.
Outro ponto é o "SELECT *". Você **realmente** precisa de todos os campos? Se não, selecione apenas o necessário
Detalhe importante: a tabela tem índices? Procure indexas os campos mais usados em cláusulas WHERE.
A tabela tem 60 mil registros, 17 mb
Todos os campos estão indexados
Preciso do * sim, mas de qq forma são todos campos char, ou integer, apenas 1 deles é text
Uns três meses atrás, fizemos uma limpeza e otimização do servidor MySQL. Entretanto, nosso servidor é linux. A performance ganha foi considerável.
Verifique o que pode ser útil na sua otimização:
http://stackoverflow.com/questions/3456159/how-to-shrink-purge-ibdata1-file-in-mysql
alterar/incluir no my.cnf
innodb_buffer_pool_size=1500M (70%-80% do total de memória do servidor)
innodb_buffer_pool_instances=8 (min 1 e max 64 – padrão do 5.6 = 8)
innodb_log_file_size=16M (http://www.percona.com/blog/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/)
innodb_flush_log_at_trx_commit=2
innodb_flush_method=O_DIRECT
innodb_file_per_table=1 ou innodb_file_per_table
Clean MySQL ibdata
http://stackoverflow.com/questions/3456159/how-to-shrink-purge-ibdata1-file-in-mysql
http://wiki.adilson.net.br/linux/banco-de-dados/mysql/tamanho-do-ibdata1
Bom dia....
Elas estão comentadas... e a innodb_buffer_pool_size, estava com 16mb
Devo descomentar certamente ?
A tabela que mais tem seletc é innodb mesmo
Sim, deve. Também deve utilizar as sugestões dos links para algumas configurações.
Descomentei as linhas, e o serviço não subiu
mudei os caminhos para C:\wamp\bin\mysql\mysql5.5.24\data, nada...
vou tentar meio dia quando não tiver ninguém usando
A melhor coisa é largar as funções mysql_*. A lib mysql é obsoleta (ou seja, antiga, sem manutenção e com menor desempenho).
Use MySQLi ou PDO. Veja http://www.ultimatephp.com.br/php-por-que-nao-utilizar-funcoes-mysql
Precisa analisar o comportamento do servidor. O gargalo pode estar em outro lugar, não apenas no banco de dados