Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Edson Hostins

Mysql, comandos que melhoram o desempenho

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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"

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 =)

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia....

Elas estão comentadas... e a innodb_buffer_pool_size, estava com 16mb

Devo descomentar certamente ?

 

# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = C:\mysql\data/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = C:\mysql\data/
#innodb_log_arch_dir = C:\mysql\data/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 6000M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 16M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 2
#innodb_lock_wait_timeout = 50

A tabela que mais tem seletc é innodb mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, deve. Também deve utilizar as sugestões dos links para algumas configurações.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.