web-dev-qa-db-fra.com

Requête SQL_CALC_FOUND_ROWS lente

Nous constatons des performances très lentes avec les requêtes qui utilisent SQL_CALC_FOUND_ROWS dans la section admin de WordPress.

Nous avons actuellement environ 125 000 publications sur notre site et nous utilisons Varnish pour mettre en cache le front-end. Nous utilisons WordPress version 4.2.3.

Le problème se pose quand des personnes utilisent la section admin de WordPress et que WordPress lance une requête comme celle ci-dessous:

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-t-il un correctif pour résoudre ce problème ou une sorte de filtre pre_get_posts que je peux exécuter?

Je prévois de supprimer certaines révisions de publication et d’optimiser une base de données, mais je voulais d’abord voir s’il existait une solution à ce problème dans WordPress.

J'ai rencontré des problèmes similaires en cherchant cela, mais la plupart de ces problèmes semblent être âgés de 2 à 6 ans.

4
bigmike7801

L'utilisation de SQL_CALC_FOUND_ROWS n'est pas vraiment un problème, même si cela entraîne des frais généraux.

WordPress utilise SQL_CALC_FOUND_ROWS pour déterminer le nombre total de publications qui auraient été renvoyées, si aucune clause LIMIT n'a été fournie. Cela est nécessaire pour calculer et vous fournir des liens de pagination corrects.

Désactiver inconditionnellement est garanti pour casser des choses partout.

Si vous pouvez identifier des requêtes spécifiques qui souffrent de son utilisation et que vous pouvez le faire sans pagination, vous pouvez accrocher à pre_get_posts et définir de manière conditionnelle le paramètre no_found_rows sur true. Ceci, cependant, est plus un bidouillage qu'une solution.

La solution appropriée consiste à utiliser un mécanisme de mise en cache des requêtes de base de données, soit du côté de la base de données, soit du côté de WordPress à l'aide d'un plugin tel que Advanced Post Cache (développé pour et utilisé dans WordPress.com).

1
Anastis