Atenção: Artigo com conteúdo altamente nerd.

nerd geek mysql wordpress

O WordPress é o software por trás deste site e de milhares na internet. Ele permite em teoria deixar que você escreva e publique seus artigos no seu site, de forma organizada e armazenada num banco de dados geralmente o MySQL. Embora o WordPress seja muito bom e popular ele tem um grande problema de se não for bem gerenciado: Quando seu site cresce, a coisa fica bem feia ao perceber o quanto que o WordPress utiliza de recursos de um servidor. Muita gente tem problemas com isso e chega até a ter seus sites bloqueados pelas empresas de hospedagem.

Já escrevi aqui sobre o consumo de CPU gerado pelo WordPress. Geralmente faço isso quando estou com esse exato problema, e não é diferente agora.

Media Temple gpu wordpress

A empresa de hospedagem que utilizo é o Media Temple e eles fazem um bom trabalho, quando tudo vai bem. Uma das funções de gerenciamento que mais utilizo é o painel de utilização de GPU, o equivalente chamado por nós de CPU. Com ele eu posso ver como meu WordPress está se comportando. Você tem direito no plano a 1000 GPUs por mês, e dividindo por dia dá mais ou menos 33 GPUs.

Quando acontece algo anormal e o WordPress “enloquece”, podemos ter as seguintes fontes de problemas:

1) Instalação de novos plugins mal construídos ou ruins para o banco de dados.
2) Links para páginas ou arquivos não existentes com erro 404.
3) MySQL: Tabelas do banco de dados corrompidas ou não otimizadas.
4) MySQL: Parametros de memória mal configurados.

Reparar e Otimizar Tabelas do MySQL

Você pode reparar as tabelas do MySQL com o seguinte comando:


mysqlcheck -auto-repair -u LOGIN -pSENHA -h SEU_HOST -A -o

Este comando é prático pois você pode inclusive agendar via CRON no seu Painel de Controle do servidor.

Outra maneira de reparar as tabelas é com o phpMyAdmin:

phpmyadmin repair optimize table

Parametros Importantes do MySQL

Para começar temos que aprender a ver os valores dos parametros do MySQL. Para alterar eles você deve editar o arquivo my.cnf do MySQL. O criador do WordPress Matt Mullenweg
disponibilizou seu arquivo my.cnf com os valores recomendados, porém eu usando o mesmo arquivo tive diversos problemas de performance, portanto tome cuidado quando alterar seu my.cnf sem saber o que está fazendo.

Conecte em seu banco de dados com o comando:

mysql -u LOGIN -pSENHA -h SEU_HOST

e entre com o comando:

show status;

Uma outra maneira de visualizar estes parâmetros do MySQL de uma forma mais organizada é usando o mysqlreport. Basta baixar o script, copiar, dar permissões 755 (chmod 755 nome-arquivo) e usar no seu servidor via ssh com o comando:

./mysqlreport –user LOGIN –password SENHA –host SEU_HOST –no-mycnf

Os parametros mais importantes do MySQL:

key_buffer_size = 26M # É o tamanho de buffer para os índices e afeta a velocidade da leitura de uma pesquisa. No manual do MySQL é recomendado seguir a regra: Os valores Key_reads/Key_read_request (dividir os dois parametros) deve ser menor que: 0.01. Desta forma você pode saber se o tamanho do seu buffer está ok.

max_connections = 100 # Número máximo de conexões ao servidor. Ver o valor de max_used_connection para calcular. Atenção ao valore de threads_created, se for grande talvez você deva aumentar o número de thread_cache_size (o número de threads que o MySQL vai guardar em memória para aceitar novas conexões). Ver Threads_created/Connections (ou 100 – ((Threads_created / Connections) * 100)) que indica o fator “cache hit rate” que deve estar perto de 100%.

table_cache = númer de tabelas abertas ao mesmo tempo para todas as threads, tente usar a seguinte fórmula: table_cache = opened table / max_used_connection

query_cache_type = 1
query_cache_size = 26M # Um espaço reservado para armazenar uma pesquisa frequente.

tmp_table_size = 24M # tamanho reservado a tabelas temporárias na memória, senão elas serão lidas em disco (ver Created_tmp_disk_tables), o que é ruim. Acho que o tipo de pesquisa do WordPress impossibilita a melhora deste fator porém no meu caso ainda consegui o que vai abaixo:


__ Created Temp _______
Disk table     27.52k     0.4/s
Table          37.40k     0.6/s    Size:  24.0M
File                6     0.0/s

Outro número importante é o fator Handler_read_rnd / Handler_read_rnd_next que indica que as pesquisas fazem FULL SCAN nas tabelas, ou não utilizando corretamente os índices. Daí você precisa ou melhorar as pesquisas dos SELECTs ou os seus índices.

Tamanho total da memória do MySQL

Para ajudar no calculo dos valores destes parametros do my.cnf você deve saber o seu limite, que é o tamanho da memória dedicada ao banco de dados. A fórmula para calcular o tamanho total de memória que pode ser alocada devido aos parametros do my.cnf é a seguinte:

mem total mysql = key_buffer + max_connections * (join_buffer + record_buffer + sort_buffer + thread_stack + tmp_table_size)

Note que o tamanho total de memória depende diretamente do multiplicador de conexões abertar (max_connections).

Existe uma ferramenta na internet para calcular a memória do MySQL de acordo com as configurações do arquivo my.cnf.

Implementando as alterações no my.cnf

Para reiniciar o MySQL basta digitar o comando:

/etc/init.d/mysqld restart

Script Para Otimizar a Performance do MySQL

Existe um script chamado tuning primer que indica o caminho correto para otimizar seu banco de dados MySQL. No Media Temple eu não tenho direito de utilizar o tuning primer por motivos de permissões, mas caso seu servidor permita, é uma excelente opção.

Conclusões e Dicas Para MySQL

Leia outros artigos sobre WordPress.

Estas são as minhas dicas de otimização do MySQL, na verdade não sou nenhum expert no assunto mas com algum estudo posso evitar erros óbvios e também conseguir deixar o meu banco de dados do WordPress em pleno funcionamento. Caso você tenha alguma dica que não está aqui, crítica ou qualquer opinião, deixe seu comentário e contribua para a discussão do assunto.

Caso esteja escolhendo um servidor de hospedagem eu recomendo o Media Temple e se optar por colocar seu blog ou site lá, faça isso clicando no banner abaixo. Desta forma estará contribuindo e incentivando para o desenvolvimento deste site.