Um site lento por causa da base de dados quase sempre tem uma ou duas consultas a fazer o trabalho todo, e a correcção mais frequente é um índice em falta. O caminho é este: descobrir qual é a consulta, pedir ao MariaDB que explique como a executa (EXPLAIN), e só depois corrigir. Mexer às cegas, ou mudar de plano, raramente resolve.
Encontrar a consulta culpada
| 1 |
No WordPress, instale o plugin Query Monitor: mostra as consultas de cada página, as mais lentas primeiro, e o plugin ou tema que as pediu.
|
|
| 2 |
Noutra aplicação, veja as consultas em curso no phpMyAdmin, em Estado, depois Processos, enquanto a página está lenta. Uma consulta que aparece repetidamente é a suspeita.
|
|
| 3 |
Num VPS seu, pode ligar o registo de consultas lentas no motor (slow_query_log e long_query_time). Na hospedagem partilhada essas definições são do servidor, não suas.
|
|
Pedir ao MariaDB que explique
No separador SQL do phpMyAdmin, escreva EXPLAIN antes da consulta suspeita e execute. A coluna type com o valor ALL significa que o motor leu a tabela toda, linha a linha. Um valor como ref ou const significa que usou um índice. A coluna rows mostra quantas linhas estima ler.
| Correcção |
Quando resulta |
Criar um índice na coluna do WHERE ou do JOIN |
O EXPLAIN mostra ALL numa tabela grande. É a mais comum. |
Pedir só as colunas de que precisa, e pôr LIMIT |
A aplicação faz SELECT * e mostra dez linhas de um milhão. |
| Reduzir a base |
Tabelas cheias de registos antigos, revisões, sessões e dados temporários. Veja onde ver o tamanho e o que pode sair. |
| Limpar as opções carregadas em todas as páginas |
No WordPress, a tabela wp_options com muitos dados marcados como autoload. |
| Cache de página |
A mesma consulta corre a cada visita. Veja instalar e afinar uma cache de páginas. |
Mais índices nem sempre é melhor. Cada índice acelera a leitura e atrasa a escrita, e ocupa espaço. Crie um de cada vez, na coluna que o EXPLAIN mostrou, e meça. E faça uma cópia antes: veja exportar com o phpMyAdmin.
|
Um exemplo, do princípio ao fim
Uma loja demora a listar encomendas por estado. Escreve EXPLAIN SELECT * FROM encomendas WHERE estado = 'pago'; e a coluna type diz ALL, com muitas linhas estimadas. Cria CREATE INDEX idx_estado ON encomendas (estado); e repete o EXPLAIN: agora o type é ref e as linhas estimadas descem muito. A página que levava tempo a abrir passa a responder logo. Foi um único índice, escolhido porque o EXPLAIN o pediu. É esta a ideia: medir, mexer numa coisa, medir de novo.
|
Encontrou a consulta mas não sabe o que fazer a seguir? Mande-nos o resultado do EXPLAIN e a aplicação e vemos consigo.
Abrir um pedido de suporte
|
PRODUTO RECOMENDADO Alojamento de sites com cPanel Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde 5.940,00 Kz/mês (plano de 3 anos, com cupão) Ver planos |