La "solution" sur laquelle je suis tombé pour l'instant est assez laide, mais pour une raison inexplicable, cela fonctionne. Ajout du STRAIGHT_JOIN
l'astuce de l'optimiseur a fait passer le temps d'exécution de plus de 18 secondes à environ 0,0022 seconde. Basé sur le bon sens et cette question (Quand utiliser STRAIGHT_JOIN avec MySQL
), cette solution semble être une mauvaise idée, mais c'est la seule chose que j'ai essayée qui a fonctionné. Donc, pour l'instant du moins, je m'y tiens. Si quelqu'un a des idées sur pourquoi je ne devrais pas faire cela, ou ce que je devrais essayer à la place, j'aimerais les entendre.
Si quelqu'un est curieux, je l'ai implémenté comme un filtre WordPress comme ceci :
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' );
Et pour être complet, voici le EXPLAIN
sortie pour la requête lors de l'utilisation de STRAIGHT_JOIN
. Encore une fois, je suis perplexe. L'ancienne requête utilisait uniquement ref
et eq_ref
que je comprends être plus rapide que range
, mais c'est des ordres de grandeur plus rapides pour une raison quelconque.
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| 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 |
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+