Quão intensivo da CPU está abrindo e fechando uma conexão de banco de dados (para um aplicativo Web) no MySQL
- ... quando o software DB está no host local?
- ... quando o software DB estiver em outra máquina?
fonte
Quão intensivo da CPU está abrindo e fechando uma conexão de banco de dados (para um aplicativo Web) no MySQL
Pense na quantidade de memória que está sendo alocada por conexão com o banco de dados. Que coisas devem ser alocadas? De acordo com o Guia de Estudo de Certificação do MySQL 5.0, página 357 :
O servidor mantém vários buffers para cada conexão do cliente. Um é usado como um buffer de comunicação para a troca de informações com o cliente. Outros buffers são mantidos por cliente para ler tabelas e executar operações de junção e classificação.
Quais configurações controlam os buffers por conexão?
Leva tempo para alocar e desalocar esses buffers quando uma conexão é criada. Não se esqueça de multiplicar a soma desses valores por max_connections . Como observação, evite usar o mysql_pconnect, pois as conexões persistentes do PHP e do MySQL não se dão bem. Aqui estão dois links informativos sobre este tópico:
No ambiente de leitura pesada e gravação pesada, como OLTP, isso seria caro em termos de uso de RAM e possível inibição devido à troca no sistema operacional. Em um site de baixa gravação e baixo índice de leitura, eu não me preocuparia tanto.
Não sei se isso importa "quanto mais caro" é. É certamente mais caro do que reutilizar a mesma conexão. O que você observará dependerá do uso correto do pool de conexões, da saturação do pool, dos recursos disponíveis na caixa etc.
Em geral, se você estiver executando um loop para fazer alguma interação com o banco de dados, será muito melhor reutilizar a mesma conexão ativa do que abrir e fechar dentro do loop (um anti-padrão que eu vejo frequentemente) .
O dilema entre reutilizar um objeto e destruí-lo e construí-lo novamente (ambos com vantagens e desvantagens) geralmente pode ser tratado com um compromisso: armazenar em cache o objeto, mas por um tempo limitado (por exemplo, com vencimento). Se o objeto for acessado com frequência, ele continuará sendo reutilizado. Mas se não for usado por algum tempo, um mecanismo de expiração o descartará, forçando-o a ser recriado quando for necessário novamente.
Um sistema pode ter um gancho global para esses tipos de caches que são chamados quando a memória está baixa, o que aciona todos eles para eliminar objetos recentemente não utilizados.
O Mysql armazena em cache conexões (ou threads) usando o Cache de Thread (thread_cache_size). O valor máximo para ele é 100. Quando o cliente fecha a conexão, ele é retornado ao cache. Quando uma nova conexão é aberta, ela verifica o cache do encadeamento. Em um sistema muito ocupado, abrir a conexão de fechamento pode ficar caro, especialmente se você tiver consultas de longa execução.
https://dev.mysql.com/doc/refman/5.6/en/connection-threads.html Se você puder pagar pelo Mysql Enterprise, poderá usar o plug-in Thread Pool implementado no Mysql 5.6.