web-dev-qa-db-fra.com

Requêtes lentes sur une base de données énorme

J'ai une base de données énorme avec plus de 250 000 postes. J'ai exécuté toutes les optimisations possibles et recherché toutes les solutions possibles sur Internet.

Disons que j'ai cette requête où je veux obtenir les 4 derniers messages d'une catégorie:

$recent = new WP_Query(array( 'cat' => '8', 'posts_per_page' => '4')); 

Quel moniteur de requêtes se traduit par:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT JOIN wp_term_relationships
ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE 1=1
AND ( wp_term_relationships.term_taxonomy_id IN (8,9,10,11,12,13,14,15) )
AND wp_posts.post_type = 'post'
AND (wp_posts.post_status = 'publish'
OR wp_posts.post_status = 'private')
GROUP BY wp_posts.ID
ORDER BY wp_posts.post_date DESC
LIMIT 0, 4

Et cela prend 1,4628 seconde.

Ma question est de savoir pourquoi si je pose la même requête dans phpmyadmin et modifie cette ligne:

AND ( wp_term_relationships.term_taxonomy_id IN (8,9,10,11,12,13,14,15) )

dans

AND ( wp_term_relationships.term_taxonomy_id IN (8) )

La requête devient deux fois plus rapide (0,5077 seconde) . Pourquoi recherche-t-il d'autres identifiants de taxonomie alors qu'il est supposé rechercher uniquement le "8" - l'identifiant de catégorie? Tout conseil serait le bienvenu.

Je vous remercie

1
John M.

Comme @milo l'a dit dans les commentaires, le paramètre cat (et des paramètres similaires dans d'autres taxonomies hiérarchiques) permettra également à la requête de figurer dans les sous-catégories. Si vous ne voulez pas que cela se produise, utilisez le paramètre category__in.

Pour ce qui est de la lenteur générale, cela est difficile à deviner, mais cela dépend des performances de votre serveur de base de données (il est peut-être sous une charge constante et il est temps de le mettre à niveau) et quelle est la profondeur de ces publications dans le tableau.

Enfin, si vous n'avez pas besoin d'informations sur le nombre de résultats correspondants qui dépassent votre limite, essayez d'ajouter 'no_found_rows' => true à votre requête. Ainsi, la base de données n'essaiera pas de calculer le nombre total d'articles dans la catégorie (la partie SQL_CALC_FOUND_ROWS de la requête).

0
Mark Kaplun