it-swarm.com.de

WP_Query-Leistungsprobleme mit meta_query

Ich arbeite an einer benutzerdefinierten Vorlage für ein neues Thema, das eine WP_Query-Instanz verwendet, um Beiträge aus 2 Beitragstypen mit 2 benutzerdefinierten Feldern auszuwählen, die NICHT leer sind. Abhängig vom Abschnitt der Site kann eine $current_zone-Variable festgelegt werden, um die Kategorie zu bestimmen, von der abgefragt werden soll.

// Custom loop
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$custom_loop_args = array(
    'post_type' => array('videos', 'post'),
    'post_status' => 'publish',
    'ignore_sticky_posts' => 1,
    'paged' => $paged,
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => 'article_source',
            'compare' => '!=',
            'value' => ''
        ),
        array(
            'key' => 'article_link',
            'compare' => '!=',
            'value' => ''
        )
    )
);

// Check the current zone
global $current_zone;

// Check for category match to current zone
if ( term_exists($current_zone, 'category') ) {
    $term = get_term_by('name', $current_zone, 'category');
    $custom_loop_args['cat'] = $term->term_id;
}

// Create unique identifier for caching
$cache_id = ( isset($term) ) ? '_term-' . $term->term_id : '_main';

// Run query or get transient cache
if ( ( $custom_loop = get_transient( "curated_wpquery$cache_id" ) ) === false ) {

    // It wasn't there, so regenerate the data and save the transient
    $custom_loop = new WP_Query( $custom_loop_args );
    set_transient( "curated_wpquery$cache_id", $custom_loop, ( 60 * 60 * 1 ) );
}

Ich benutze die Transienten, um dies zu beschleunigen, was funktioniert, aber die anfängliche Abfrage dauert 35 Sekunden und eine verrückte Menge an Speicher, um fertig zu werden. Wir haben eine ziemlich große Datenbank mit ungefähr 10.553 Einträgen in der Tabelle posts. Ich habe die Überarbeitungen gelöscht, aber keine Leistungssteigerung festgestellt.

Meine eigentliche Frage lautet also: Wie kann ich die Leistung dieser Abfrage verbessern? Wäre eine benutzerdefinierte $wpdb-Abfrage am besten oder ist die Abfrage benutzerdefinierter Felder auf diese Weise insgesamt unproduktiv?

Jede Hilfe wird sehr geschätzt.

2
Kevin Leary

Benutzerdefinierte Felddaten werden in der Tabelle postmeta gespeichert, und es ist wahrscheinlich, dass das Durchsuchen dieser Tabelle zu Langsamkeit führt.

Du solltest:

  • installieren Sie das Debug-Leisten-Plugin , um einen besseren Einblick in die Abfragen zu erhalten, die für die Datenbank ausgeführt werden. Sie können sehen, wie lange jede Abfrage dauert und welchen SQL-Code sie tatsächlich enthält ausgeführt wird.
  • Suchen Sie die Abfragen, deren Ausführung sehr lange dauert, und EXPLAIN sie . Auf diese Weise erhalten Sie eine bessere Vorstellung davon, was los ist und wie Sie vorgehen müssen.
5
anu