Como a CPU intensiva está abrindo e fechando uma conexão de banco de dados (para um aplicativo da web) no MySQL
- ... quando o software DB está em localhost?
- ... quando o software DB está em outra máquina?
Como a CPU intensiva está abrindo e fechando uma conexão de banco de dados (para um aplicativo da web) no MySQL
Pense na quantidade de memória alocada por conexão de banco de dados. Que coisas devem ser alocadas? De acordo com o MySQL 5.0 Certification Study Guide, página 357 :
Quais configurações controlam os buffers por conexão?
Leva tempo para alocar e desalocar esses buffers quando uma conexão é estabelecida. Não se esqueça de multiplicar a soma desses valores por max_connections . Como observação, evite usar 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:
Em ambientes de leitura 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 escrita e baixa leitura, eu não me preocuparia tanto.
Não tenho certeza se importa "quanto mais caro" é. Certamente é mais caro do que reutilizar a mesma conexão. O que você observará dependerá se você está usando corretamente o pool de conexões, quão saturado está seu pool, os 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 antipadrão que vejo com frequência) .
O dilema entre reutilizar um objeto e derrubá-lo e construí-lo novamente (ambos com vantagens e desvantagens) geralmente pode ser resolvido com um meio-termo: armazenar o objeto em cache, mas por um tempo limitado (ou seja, com expiração). 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 descarta, obrigando-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 faz com que todos eles descartem objetos não utilizados recentemente.
O Mysql armazena em cache as conexões (ou threads) usando o Thread Cache ( 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 e fechar conexão pode ficar caro, especialmente se você tiver consultas longas.
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.