„Rozwiązanie”, na które się natknąłem, jest dość brzydkie, ale z jakiegoś niewytłumaczalnego powodu działa. Dodawanie STRAIGHT_JOIN
wskazówka optymalizatora zmniejszyła czas wykonania z ponad 18 sekund do około 0,0022 sekundy. Opierając się na zdrowym rozsądku i na tym pytaniu (Kiedy używać STRAIGHT_JOIN z MySQL
), to rozwiązanie wydaje się złym pomysłem, ale to jedyna rzecz, którą wypróbowałem, która zadziałała. Więc przynajmniej na razie się tego trzymam. Jeśli ktoś ma jakieś przemyślenia na temat tego, dlaczego nie powinienem tego robić lub czego powinienem spróbować zamiast tego, chciałbym go usłyszeć.
Jeśli ktoś jest ciekawy, zaimplementowałem go jako filtr WordPress w następujący sposób:
Funkcjafunction 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' );
A dla kompletności, oto EXPLAIN
dane wyjściowe dla zapytania przy użyciu STRAIGHT_JOIN
. Znowu jestem zbity z tropu. Stare zapytanie używało tylko ref
i eq_ref
który, jak rozumiem, jest szybszy niż range
, ale z jakiegoś powodu jest to o rząd wielkości szybsze.
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| 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 |
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+