Desempenho e monitorização

Consultas SQL lentas do tipo "SELECT SQL_CALC_FOUND_ROWS"

Revisto a 3 min de leitura wordpress rendimiento base de datos

Ao investigar a lentidão do WordPress, pode encontrar consultas com esta estrutura:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_postmeta
ON ( wp_posts.ID = wp_postmeta.post_id )
...
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
INNER JOIN wp_postmeta
ON ( wp_posts.ID = wp_postmeta.post_id )
WHERE 1=1
...

Os fragmentos anteriores são ilustrativos, não consultas completas para executar. SQL_CALC_FOUND_ROWS permite calcular o total que corresponde aos filtros, mesmo que a consulta devolva apenas uma página de resultados. Pode aparecer com tabelas diferentes, não exclusivamente posts e postmeta.

À medida que as tabelas crescem, uma consulta que examina demasiadas linhas pode demorar mais e tornar-se um estrangulamento. O efeito depende dos dados e do plano de execução.

A presença de SQL_CALC_FOUND_ROWS não identifica por si só a causa. O custo pode depender dos filtros, de um JOIN sobre metadados, do volume de resultados, da ordenação aplicada ou dos índices que já existam. Localize primeiro o plugin, o tema ou o pedido que gera a consulta com o PHP X-Ray.

Antes de criar um índice, guarde uma cópia recuperável e execute EXPLAIN sobre a consulta completa. Verifique também os índices atuais da tabela:

SHOW INDEX FROM wp_postmeta;

Um índice combinado como (post_id, meta_key) pode ajudar determinados planos de execução, mas não é uma solução universal e acrescenta custo a cada escrita. Se a análise confirmar que falta, utilize uma ferramenta mantida como o Index WP MySQL For Speed ou peça ao programador que desenhe e teste o índice num clone.

Depois da alteração, repita o EXPLAIN, compare o tempo em várias execuções e verifique inserções, pesquisas, administração e tarefas agendadas. Reverta o índice se não melhorar o plano ou se penalizar outras operações.

Se o código não precisar de paginação

Numa consulta própria construída com WP_Query, o programador pode avaliar no_found_rows => true quando não se utiliza o total nem o número de páginas. Não o aplique globalmente: avariaria funções que dependem desses valores. A referência de WP_Query descreve o parâmetro.

Reveja também os filtros, a ordenação e o número de resultados pedidos. Não edite o núcleo do WordPress nem elimine a cláusula de uma consulta gerada só porque aparece no relatório. A validação deve verificar os resultados e a paginação, além do tempo.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.