Otimizar conexões do MySQL

1. Otimizar conexões do MySQL

Victor Otávio Ferreira
VictorOtavio

(usa Ubuntu)

Enviado em 01/10/2015 - 10:44h

Pessoal, tudo bom!?

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. 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.

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?

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? 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?

Desde já agradeço qualquer ajuda. ;)

-----
Victor Ferreira - Analista Desenvolvedor
http://fastwaysistemas.com.br



  


2. Re: Otimizar conexões do MySQL

Airton Lastori
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.





3. Re: Otimizar conexões do MySQL

Victor Otávio Ferreira
VictorOtavio

(usa Ubuntu)

Enviado em 02/10/2015 - 11:44h

Você quer otimizar por algum motivo específico? Seu sistema está lento? Qual o sintoma?

Não há nenhum problema aparente com a aplicação ou com o banco no momento. Estou apenas fazendo uma pesquisa porque implementaremos um novo recurso que aumentará exponencialmente os acessos ao sistema e isso me preocupa.

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.

No momento eu faço o monitoramento apenas pelo MySQLTuner, que na maioria das vezes me deixa mais cheio de dúvidas do que me ajuda.

Acabei encontrando pela web uma explicação que me ajudou bastante: https://pt.stackoverflow.com/questions/16957/php-e-mysql-como-milhares-de-conex%C3%B5es-s%C3%A3o-pro... Agradeço as recomendações. A partir daqui eu já consigo me nortear.

-----
Victor Ferreira - Analista Desenvolvedor
http://fastwaysistemas.com.br






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts