Die "Lösung", über die ich jetzt gestolpert bin, ist ziemlich hässlich, aber aus unerklärlichen Gründen funktioniert sie. Hinzufügen des STRAIGHT_JOIN
Optimiererhinweis hat die Ausführungszeit von über 18 Sekunden auf etwa 0,0022 Sekunden gesenkt. Basierend auf gesundem Menschenverstand und dieser Frage (When to use STRAIGHT_JOIN with MySQL
). ), diese Lösung scheint eine schlechte Idee zu sein, aber es ist das einzige, was ich versucht habe, das funktioniert hat. Also zumindest bleibe ich jetzt dabei. Wenn jemand eine Idee hat, warum ich das nicht tun sollte oder was ich stattdessen versuchen sollte, würde ich sie gerne hören.
Falls jemand neugierig ist, ich habe es wie folgt als WordPress-Filter implementiert:
function use_straight_join( $distinct_clause ) {
$distinct_clause = ( $use_straight_join ) ? 'STRAIGHT_JOIN' . $distinct_clause : $distinct_clause;
return $distinct_clause;
}
add_filter( 'posts_distinct', 'use_straight_join' );
Und der Vollständigkeit halber hier das EXPLAIN
Ausgabe für die Abfrage bei Verwendung von STRAIGHT_JOIN
. Wieder bin ich verblüfft. Die alte Abfrage verwendete nur ref
und eq_ref
was meines Erachtens schneller ist als range
, aber das ist aus irgendeinem Grund um Größenordnungen schneller.
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| 1 | SIMPLE | wp_posts | range | PRIMARY,type_status_date | type_status_date | 124 | NULL | 6 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | wp_postmeta | ref | post_id,meta_key | post_id | 8 | db.wp_posts.ID | 2 | Using where |
| 1 | SIMPLE | mt1 | ref | post_id,meta_key | post_id | 8 | db.wp_posts.ID | 2 | Using where |
| 1 | SIMPLE | mt2 | ref | post_id,meta_key | post_id | 8 | db.wp_posts.ID | 2 | Using where |
| 1 | SIMPLE | mt3 | ref | post_id,meta_key | post_id | 8 | db.wp_posts.ID | 2 | Using where |
| 1 | SIMPLE | mt4 | ref | post_id,meta_key | post_id | 8 | db.wp_posts.ID | 2 | Using where |
| 1 | SIMPLE | mt5 | ref | post_id,meta_key | post_id | 8 | db.mt3.post_id | 2 | Using where |
| 1 | SIMPLE | mt6 | ref | post_id,meta_key | post_id | 8 | db.wp_posts.ID | 2 | Using where |
| 1 | SIMPLE | wp_term_relationships | ref | PRIMARY,term_taxonomy_id | PRIMARY | 8 | db.wp_posts.ID | 1 | Using where; Using index |
| 1 | SIMPLE | tt1 | ref | PRIMARY,term_taxonomy_id | PRIMARY | 8 | db.wp_posts.ID | 1 | Using where; Using index |
| 1 | SIMPLE | tt2 | ref | PRIMARY,term_taxonomy_id | PRIMARY | 8 | db.mt1.post_id | 1 | Using where; Using index |
| 1 | SIMPLE | tt3 | ref | PRIMARY,term_taxonomy_id | PRIMARY | 8 | db.wp_posts.ID | 1 | Using where; Using index |
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+