Consulta SQL_CALC_FOUND_ROWS lenta

4

Estamos com um desempenho muito lento com consultas que usam SQL_CALC_FOUND_ROWS na seção administrativa do WordPress.

Atualmente, temos cerca de 125.000 postagens em nosso site e usamos o Varnish para armazenar em cache o front-end e estão no WordPress versão 4.2.3.

O problema surge quando há pessoas usando a seção de administração do WordPress e o WordPress executa uma consulta como a abaixo:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID 
FROM wp_posts 
WHERE 1=1 AND (((wp_posts.post_title LIKE '%denali%') 
OR (wp_posts.post_content LIKE '%denali%'))) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' 
OR wp_posts.post_status = 'future' 
OR wp_posts.post_status = 'draft' 
OR wp_posts.post_status = 'pending' 
OR wp_posts.post_status = 'private') 
ORDER BY wp_posts.post_title LIKE '%denali%' DESC, 
wp_posts.post_date DESC LIMIT 0, 20 

Existe um patch para corrigir esse problema ou algum tipo de filtro pre_get_posts que posso executar?

Eu planejo remover algumas revisões posteriores e fazer algumas otimizações no banco de dados, mas primeiro queria ver se havia algum tipo de correção para isso no WordPress.

Eu me deparei com problemas semelhantes enquanto procurava por isso, mas a maioria desses problemas parece ter de 2 a 6 anos de idade.

    
por bigmike7801 04.09.2015 / 22:36

2 respostas

1

O uso de SQL_CALC_FOUND_ROWS não é realmente um problema, embora ocorra uma sobrecarga.

O que acontece é que o WordPress usa SQL_CALC_FOUND_ROWS para determinar o total de postagens que seriam retornadas, se nenhuma cláusula LIMIT fosse fornecida. Isso é necessário para calcular e fornecer links de paginação corretos.

Desativar incondicionalmente é garantido para quebrar as coisas em todo o lugar.

Se você puder identificar consultas específicas que sofrem com seu uso, e você pode fazer sem paginação, então você pode ligar para pre_get_posts e definir condicionalmente o parâmetro no_found_rows para true. Isso, no entanto, é mais um truque do que uma solução.

A solução apropriada é usar um mecanismo de cache de consulta de banco de dados, do lado do banco de dados ou do lado do WordPress, usando um plug-in como Cache de Postagens Avançadas (desenvolvido para e usado no WordPress.com)

    
por Anastis 22.06.2017 / 21:13
-1

$ query- > set ('no_found_rows', true);

    
por Younes Nesta 23.02.2017 / 15:09