"Solusi" yang saya temukan saat ini cukup jelek, tetapi untuk beberapa alasan yang tidak dapat dijelaskan, itu berhasil. Menambahkan STRAIGHT_JOIN
petunjuk pengoptimal menurunkan waktu eksekusi dari 18+ detik menjadi sekitar 0,0022 detik. Berdasarkan akal sehat dan pertanyaan ini (Kapan menggunakan STRAIGHT_JOIN dengan MySQL
), solusi ini sepertinya ide yang buruk, tetapi itu satu-satunya hal yang saya coba yang berhasil. Jadi, setidaknya untuk saat ini, saya berpegang teguh pada itu. Jika ada yang memiliki pemikiran tentang mengapa saya tidak melakukan ini, atau apa yang harus saya coba, saya akan senang mendengarnya.
Jika ada yang penasaran, saya menerapkannya sebagai filter WordPress seperti:
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' );
Dan untuk kelengkapannya, berikut EXPLAIN
output untuk kueri saat menggunakan STRAIGHT_JOIN
. Sekali lagi, saya bingung. Kueri lama hanya menggunakan ref
dan eq_ref
yang saya pahami lebih cepat dari range
, tapi ini beberapa kali lipat lebih cepat untuk beberapa alasan.
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| 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 |
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+