web-dev-qa-db-fra.com

La commande de publication de liste par méta_valeur peut-elle causer des problèmes de performances?

Pour affiner le code et ajouter de nouvelles fonctionnalités à mon plugin, je souhaite afficher les publications classées par valeur de colonne méta spécifique, comme ceci;

query_posts($query_string . '&meta_key=views&orderby=meta_value&order=DESC');

Peut-il causer des problèmes de performances pour les gros blogs ayant plus de 10000 messages au total?

  • Je peux utiliser WP_Query () ou get_posts () à la place de query_post ()
2
Amit Kumar Gupta

comportement meta_query & tax_query

Lorsque vous définissez un meta/tax_query et que vous utilisez la nouvelle liste d'arguments de style de tableau pour plusieurs ensembles de clés de champ personnalisées ou de termes, votre requête peut ressembler à ce qui suit

array(
  'tax_query' => array(
    'relation' => 'OR',
    array('taxonomy' => 'tax1', 'field' => 'slug', 'terms' => 'term1'),
    array('taxonomy' => 'tax2', 'field' => 'slug', 'terms' => 'term2'),
  )
)

Ce serait le résultat:

SELECT SQL_CALC_FOUND_ROWS wp_posts.* FROM wp_posts  
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_term_relationships AS tt1 ON (wp_posts.ID = tt1.object_id) 
WHERE 1=1 AND
...
AND (wp_term_relationships.term_taxonomy_id IN (XXX) 
  OR tt1.term_taxonomy_id IN (YYY) ) 
...

Exemple de code tiré de ce ticket de traçage par @Otto . Veuillez vous y abonner pour suivre ses progrès et voter pour obtenir un changement de base.

Le problème avec la requête…

… Est fondamentalement que vous obtiendrez une JOIN pour chaque colonne. Ce n'est pas nécessaire, car les tables sont déjà fondues avec le 1st JOIN. Malheureusement, le noyau se comporte simplement comme cela dans l'état actuel 3.3.x et restera comme cela dans 3.4.

Peut-être une solution?

Votre meilleure chance serait d'intercepter le filtre posts_clauses dans votre plugin et de modifier manuellement la requête. Le vrai problème avec cette solution est que vous devez faire un str_replace( $search, $replace, $query ); dans votre plugin. D'une part, cela peut ralentir les choses et, d'autre part, vous devrez suivre ce ticket, car lorsque ce dernier entrera, votre plugin sera tout simplement cassé (mieux vaut laisser un lien vers le ticket dans le code de votre plugin).

Que puis-je faire?

Sautez dans trac et ajoutez vos pensées et vos correctifs au ticket . Si vous êtes un véritable héros, vous pouvez également essayer de résoudre le problème meta_query également.

La communauté vous remercierait :)

Si vous pensez que cette image est inappropriée, supprimez-la simplement.

1
kaiser