alastori
(usa Outra)
Enviado em 01/10/2015 - 17:31h
Estou com uma dúvida pertinente com relação as conexões no meu banco de dados.
Me disseram que a cada nova conexão ao MySQL uma parte da memória RAM é reservada para essa conexão.
Sim, correto.
Eu possuo diversas aplicações desenvolvidas em PHP e que conectam no mesmo banco de dados. Minha dúvida é: como funcionam as conexões com o banco no PHP e se existe uma forma de otimiza-las.
Você quer otimizar por algum motivo específico? Seu sistema está lento? Qual o sintoma?
Pelo que eu sei, o cada vez que o script PHP executa, ele abre uma conexão com o banco e essa conexão dura, geralmente, até o fim da execução do script. Seguindo esse raciocínio, se o mesmo script for executado 10 vezes por clientes diferentes ou não ao mesmo tempo, ainda que por milésimos de segundo, teremos 10 conexões diferentes com o banco. Estou certo!? É isso mesmo que acontece na prática?
Sim, por padrão, cada conexão SIMULTÂNEA abre uma thread. Se você tiver 1000 conexões simultâneas terá 1000 threads dedicadas, 1 a cada conexão.
https://dev.mysql.com/doc/refman/5.6/en/connection-threads.html
Se o raciocínio acima está correto e novas conexões com o banco são abertas sempre que o meu script PHP é executado, então uma parte da memória RAM é alocada dinamicamente pra cada execução do script, correto?
A rigor sim, mas existem mecanismos de cache dentro do MySQL que evitam muita alocação/desalocação de memória.
Existe alguma forma de otimizar as conexões com o banco de dados de modo a reaproveitar as conexões abertas? Se possível, abrir uma única conexão por onde o script comunicará com o banco quantas vezes for necessário. Isso é possível?
Sim. Você pode usar alguma solução de Pool de Conexões, tanto no lado da aplicação, quanto do lado do banco de dados. Porém, primeiramente defina se realmente isso é um gargalo para você. Usa alguma ferramenta de monitoramento? Basicamente você vai analizar por algum tempo em horários de pico o comportamento das variáveis de status Threads_connected, Threads_created, Threads_running, Threads_cached e Uptime. É muito mais fácil fazer isso através de uma ferramenta de monitoramento, mas você também pode usar o mysqladmin ou SHOW GLOBAL STATUS.
Se realmente isso for um gargalo e tiver que ser otimizado, você poderá:
-no MySQL, fazer tuning do thread cache e das variáveis que alocam memória por conexão;
-implementar thread pool no MySQL (na Oracle isso é uma opção da edição Enterprise);
-implementar pool de conexões na aplicação.