Verbessern oder optimieren Sie eine sehr langsame Abfrage

Ich habe eine ziemlich große database – 113.299 Zeilen in wp_posts und 216.0649 Zeilen in wp_postmeta.

Es gibt eine benutzerdefinierte Abfrage, die ich nach dem Hinzufügen oder Bearbeiten eines Posts ausführe, die bei jedem Lauf in der Langsam-Log-Datei von MySQL erscheint – und scheint viel zu viele Sekunden zu benötigen (zwischen 17 und 78 Sekunden).

So sieht es in query_posts :

  $args = array( 'meta_query' => array( array( 'key' => 'article_template', 'value' => 'news', ), ), 'posts_per_page' => '30', 'category__in' => array( 3, 4, 5 ), 'post_status' => 'publish', 'no_found_rows' => true, 'orderby' => 'meta_value', 'meta_key' => 'article_datetime', 'order' => 'DESC' ); query_posts( $args ); 

Und so sieht es in der langsamen Log-Datei von MySQL aus:

 SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 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_term_relationships.term_taxonomy_id IN (3,4,5) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.meta_key = 'article_datetime' AND (mt1.meta_key = 'article_template' AND CAST(mt1.meta_value AS CHAR) = 'news') ) GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC LIMIT 0, 30; 

Dies zeigt EXPLAIN für diese Abfrage:

 mysql> explain SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 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_term_relationships.term_taxonomy_id IN (3,4,5) ) AND wp_posts.post_type = 'post' AND (wp_posts.post_status = 'publish') AND (wp_postmeta.meta_key = 'article_datetime' AND (mt1.meta_key = 'article_template' AND CAST(mt1.meta_value AS CHAR) = 'news') ) GROUP BY wp_posts.ID ORDER BY wp_postmeta.meta_value DESC LIMIT 0, 30; +----+-------------+-----------------------+--------+--------------------------+----------+---------+-----------------------------+-------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------------------+--------+--------------------------+----------+---------+-----------------------------+-------+----------------------------------------------+ | 1 | SIMPLE | wp_postmeta | ref | post_id,meta_key | meta_key | 768 | const | 98576 | Using where; Using temporary; Using filesort | | 1 | SIMPLE | wp_posts | eq_ref | PRIMARY,type_status_date | PRIMARY | 8 | toi_web.wp_postmeta.post_id | 1 | Using where | | 1 | SIMPLE | mt1 | ref | post_id,meta_key | post_id | 8 | toi_web.wp_postmeta.post_id | 11 | Using where | | 1 | SIMPLE | wp_term_relationships | ref | PRIMARY,term_taxonomy_id | PRIMARY | 8 | toi_web.mt1.post_id | 2 | Using where; Using index | +----+-------------+-----------------------+--------+--------------------------+----------+---------+-----------------------------+-------+----------------------------------------------+ 

Ich frage mich also, ob jemand einen guten Tipp oder Vorschlag hat, wie man das optimiert und die langsame Abfrage vermeidet? Vielleicht in eine andere query_posts Schleife? Oder nehmen Sie zuerst die IDs der Beiträge mit einer einfachen wpdb->get_results Abfrage?

Ich bin offen für irgendwelche Vorschläge 🙂

Übrigens haben wir einen sehr robusten MySQL-Cluster, daher sind Serverressourcen nicht das Problem .

Solutions Collecting From Web of "Verbessern oder optimieren Sie eine sehr langsame Abfrage"

  1. Wenn ich “article_datetime” für einen numerischen Wert halte, würde ich vorschlagen, statt ‘orderby’ => ‘meta_value’ ‘orderby’ => ‘meta_value_num’ zu verwenden.
  2. Wenn die Abfrage immer noch langsam ist, dann entfernen Sie:

    ‘orderby’ => ‘meta_wert’, ‘meta_key’ => ‘article_datetime’, ‘Auftrag’ => ‘DESC’

und sortieren Sie stattdessen das Ergebnis in PHP.