wake-up-neo.net

wie kann man eine komplexe wp_query beschleunigen?

Ich habe ein Wordpress-Plugin erstellt , das überprüft, ob ein BBPress-Forum/-Thema gelesen wurde .

Grundsätzlich wird beim Lesen eines Themas ein Post-Meta bbppu_read_by zum Thema hinzugefügt, das für den Wert die Benutzer-ID enthält.

Dann, wenn ich die gelesenen Themen erhalten möchte (z. B. hier, für Forum-ID # 3526 und Benutzer # 1); Ich verwende eine benutzerdefinierte Abfrage mit diesen Argumenten:

$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
);

Das generiert diese Abfrage:

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

In PhPMyAdmin dauert diese Abfrage ungefähr 0,0393 Sekunden und gibt 228 Beiträge zurück.

Dieselbe Abfrage ohne das Postmeta-Zeug dauert nur 0,0022 Sekunden.

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 

Das ist ein großer Unterschied, es ist ungefähr 18 mal schneller.

Ich habe einen Benutzer, der sich beschwert, dass das Plugin langsam ist. Er hat ein Forum mit über 100.000 Beiträgen.

Ich habe mich gefragt, ob Sie Lösungen haben, um dies zu beschleunigen.

1
gordie

Was der Benutzer gelesen hat, ist eine Eigenschaft des Benutzers, nicht des Themas. Sie benötigen diese Informationen pro Benutzer und müssen dazu Werte in der Meta des Benutzers speichern. Möglicherweise möchten Sie auch wissen, welche Benutzer ein Thema lesen, damit sich Ihr aktuelles System nicht gegenseitig ausschließt, aber es ist konzeptionell schlecht, was dazu führt, dass es langsam ist.

1
Mark Kaplun