web-dev-qa-db-fra.com

comment accélérer un wp_query complexe?

J'ai créé un plugin Wordpress qui vérifie si un forum/sujet bbPress a été lu .

Fondamentalement, lorsqu'une rubrique est lue, une méta-publication bbppu_read_by est ajoutée à la rubrique, qui a pour valeur l'ID utilisateur.

Ensuite, si je veux obtenir les sujets lus (par exemple, ici, pour l'ID de forum n ° 3526 et l'utilisateur n ° 1); J'utilise une requête personnalisée avec ces arguments:

$read_query_args = array(
    'post_type'                 => 'topic',
    'post_parent'               => 3526,
    'posts_per_page'            => -1,
    'post_status'               => 'publish,closed,private',
    'meta_query' => array(
        //fetch only read posts
        array(
            'key'       => 'bbppu_read_by',
            'value'     => 1, //user ID
            'compare'   => '=',
        ),
        //ignore posts that are older than the user's registration time
        array(
            'key' => '_bbp_last_active_time',
            'value' => '2015-10-04 11:51:05',
            'compare' => '>',
        ),

    ),
    //try to optimize the query
    'fields'                    => 'ids', //get only IDs
    'no_found_rows'             => true, //https://wpartisan.me/tutorials/wordpress-database-queries-speed-sql_calc_found_rows
    'update_post_term_cache'    => false //ignore terms
);

Cela génère cette requête:

SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id ) WHERE 1=1 AND wp_posts.post_parent = 3526 AND ( ( wp_postmeta.meta_key = '_bbp_last_active_time' AND wp_postmeta.meta_value > '2015-10-04 11:51:05' ) AND ( mt1.meta_key = 'bbppu_read_by' AND mt1.meta_value = '1' ) ) AND wp_posts.post_type = 'topic' AND ((wp_posts.post_status = 'publish' OR wp_posts.post_status = 'closed' OR wp_posts.post_status = 'private')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC

Dans PhPMyAdmin, cette requête prend environ 0.0393 secondeset renvoie 228 articles.

La même requête sans les éléments postmeta prendseulement 0.0022secondes.

SELECT wp_posts.ID FROM wp_posts WHERE 1=1  AND wp_posts.post_parent = 3526 AND wp_posts.post_type = 'topic' AND ((wp_posts.post_status = 'publish' OR wp_posts.post_status = 'closed' OR wp_posts.post_status = 'private')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC 

C'est une différence énorme, c'estenviron 18 foisplus rapide.

J'ai un utilisateur qui se plaint de la lenteur du plugin; il a un forum avec plus de 100.000 posts.

Je me demandais si vous aviez des solutions pour rendre cela plus rapide?

1
gordie

Ce que l'utilisateur a lu est une propriété de l'utilisateur et non du sujet. Vous avez besoin de ces informations par utilisateur. Pour ce faire, vous devez enregistrer les valeurs dans les méta de l'utilisateur. Vous pouvez également vouloir savoir quels utilisateurs lisent un sujet pour que votre système actuel ne s'exclue pas mutuellement, mais il est conceptuellement mauvais, ce qui le ralentit.

1
Mark Kaplun