O Pesadelo Silencioso: Como uma Tabela wp_options Inflada Pode Derreter o Core Web Vitals do Seu Site WordPress

O Pesadelo Silencioso: Como uma Tabela wp_options Inflada Pode Derreter o Core Web Vitals do Seu Site WordPress

Você já sentiu aquele frio na espinha quando um site que estava voando começa a engasgar do nada? Sem plugins novos, sem pico de tráfego, apenas uma lentidão fantasma que consome seus recursos e, pior, seu ranking no Google. Pois é. Eu já. E o culpado estava escondido a plena vista: a tabela wp_options.

Deixe-me contar uma história rápida. Era uma madrugada de terça-feira, e eu estava monitorando um cluster de sites WordPress gerenciados. De repente, um dos servidores começou a apresentar picos de I/O em disco. O time de infra estava perdendo cabelos. Após horas de debug, descobrimos que um simples plugin de cache, mal configurado, estava gerando milhares de transientes expirados que nunca eram limpos. A tabela wp_options tinha 2 milhões de linhas. Dois milhões. O sitesite não estava lento — estava morrendo sufocado por metadados inúteis. Esse é o tipo de problema que nenhum tutorial de ‘5 dicas para acelerar o WordPress’ vai te contar.

O Monstro Invisível: Anatomia da Tabela wp_options

A tabela wp_options é o armário de bagunças do WordPress. Tudo que precisa ser armazenado como par chave-valor vai para lá: configurações do site, opções de plugins, dados de transientes, e até blocos do Gutenberg. O problema é que, ao contrário de outras tabelas como wp_posts ou wp_postmeta, não há uma indexação robusta para consultas comuns. Cada SELECT * FROM wp_options WHERE option_name = 'alguma_coisa' pode varrer milhões de linhas se não houver índice adequado. E o pior: muitos plugins salvam dados serializados enormes, como arrays de configuração ou objetos, que tornam a leitura ainda mais custosa.

Segundo dados da Kinsta, uma tabela wp_options com mais de 100 mil linhas já começa a apresentar degradação perceptível em consultas simples. Mas o verdadeiro caos começa acima de 500 mil linhas. Cada requisição ao wp-admin ou até mesmo ao front-end pode disparar dezenas de consultas SELECT * FROM wp_options — seja por causa de transientes, opções de temas, ou plugins mal-educados que não limpam seus rastros.

O Gole de Veneno: Transientes, Autoload e o Lazy Cleanup

O sistema de transientes do WordPress é uma faca de dois gumes. Ele foi projetado para cache temporário, mas muitos plugins abusam dele, armazenando dados que nunca expiram ou que expiram mas ficam órfãos. Pior: quando um transiente tem o atributo autoload definido como ‘yes’, ele é carregado em todas as páginas do site. Imagine um transiente de 1 MB sendo carregado em cada visita. Agora multiplique por 10, 20, 100 transientes. Seu servidor não está lento — está trabalhando de graça para o lixo digital.

Um estudo de caso da Pagely mostrou que a remoção de 1.200 transientes órfãos reduziu o tempo de carregamento de um site de 8 segundos para 2 segundos. Isso não é placebo. É física. O banco de dados deixou de ser um pântano e virou um rio limpo.

Core Web Vitals: O Juiz Implacável

O Google deixa claro: LCP, FID e CLS são os novos deuses do ranking. Uma tabela wp_options inflada afeta diretamente o LCP (Largest Contentful Paint) porque adiciona latência nas queries iniciais. O servidor precisa esperar o banco devolver dados antes de começar a renderizar. Se a tabela tem milhões de linhas, cada query pode levar centenas de milissegundos. Some isso a consultas repetitivas e você tem um LCP de 4 segundos. Selva.

Além disso, o FID (First Input Delay) sofre porque o JavaScript do tema ou plugin muitas vezes depende de opções carregadas via AJAX ou diretamente no HTML, bloqueando a thread principal. E o CLS (Cumulative Layout Shift)? Pode ser afetado indiretamente por imagens ou iframes cujas dimensões são definidas por opções dinâmicas que demoram a ser carregadas.

Diagnóstico: Como Identificar o Inchaço

  • Query Monitor: Ative e veja quantas queries são disparadas para wp_options em cada página. Se passar de 20, algo está errado.
  • PhpMyAdmin: Execute SELECT COUNT(*) FROM wp_options. Se passar de 100 mil, acenda o alerta.
  • MySQL Workbench: Analise o tamanho da tabela com SELECT table_name, ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Tamanho (MB)' FROM information_schema.tables WHERE table_schema = 'seu_banco' AND table_name = 'wp_options';. Mais de 50 MB? Hora de agir.

A Solução Cirúrgica: Limpeza Automatizada e Boas Práticas

Não adianta sair deletando tudo. Você precisa de uma estratégia. Aqui estão os passos que aplicamos em ambientes de produção:

  1. Auditoria de autoload: Descubra quais opções estão marcadas como autoload=yes. Remova as desnecessárias, especialmente transientes antigos. Use SELECT option_name, LENGTH(option_value) AS tamanho FROM wp_options WHERE autoload = 'yes' ORDER BY tamanho DESC LIMIT 20; para identificar os maiores.
  2. Expurgo de transientes expirados: O WordPress já tem uma rotina de limpeza automática, mas ela depende de visitas ao site. Em sites com pouco tráfego, transientes mortos acumulam. Use um plugin como Transient Cleaner ou agende um cron job: DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_value < UNIX_TIMESTAMP(); (isso é só um exemplo genérico; adapte ao seu caso).
  3. Indexação inteligente: Adicione um índice em option_name e autoload. Cuidado: índices demais podem prejudicar escritas. Teste em staging primeiro.
  4. Cache de queries: Use Redis ou Memcached para cachear resultados de queries frequentes, como opções de tema e plugins.
  5. Migração de dados serializados: Se possível, evite guardar arrays enormes em wp_options. Use post meta ou tabelas customizadas, com índices adequados.

Dados Reais: O Antes e Depois

Em um cliente específico, uma loja WooCommerce com 50 mil produtos, a tabela wp_options tinha 1,8 milhão de linhas (900 MB). As consultas de opções estavam demorando em média 800 ms. Após a limpeza de transientes órfãos (cerca de 1,2 milhão de linhas removidas) e a otimização do autoload, o tamanho caiu para 150 MB e o tempo de consulta médio para 40 ms. O LCP caiu de 5,2s para 1,8s. O site voltou a respirar.

Mas não se engane. Esse problema é recorrente. Você precisa de monitoramento contínuo. Crie alertas no seu sistema de monitoramento (New Relic, Datadog, ou até scripts caseiros) para disparar quando a tabela wp_options ultrapassar um limite seguro, como 200 mil linhas ou 50 MB.

Manifesto: Contra a Cultura do 'Joga e Esquece'

Esse é um grito de guerra contra a cultura de plugins que poluem o banco de dados como se não houvesse amanhã. Desenvolvedores, parem de usar wp_options como depósito de lixo. Usem wp_cache_set para dados temporários, limpem transientes quando desativarem seus plugins, e documentem as opções que criam. Não é difícil. É questão de respeito pelo recurso alheio.

E você, dono de site, não dependa de soluções mágicas. Monitore, audite, limpe. Seu Core Web Vitals agradece. E o Google também.

— Um insider que já viu tabelas de 2GB e sobreviveu para contar a história.

Rolar para cima