"Giải pháp" mà tôi đã vấp phải bây giờ là khá xấu, nhưng vì một số lý do không thể giải thích được, nó hoạt động. Thêm STRAIGHT_JOIN
gợi ý trình tối ưu hóa đã giảm thời gian thực hiện từ 18 giây xuống khoảng 0,0022 giây. Dựa trên cảm nhận chung và câu hỏi này ( Khi nào sử dụng STRAIGHT_JOIN với MySQL
), giải pháp này có vẻ là một ý tưởng tồi, nhưng đó là điều duy nhất tôi đã thử đã hoạt động. Vì vậy, ít nhất bây giờ, tôi đang gắn bó với nó. Nếu ai đó có bất kỳ suy nghĩ nào về lý do tại sao tôi không nên làm điều này hoặc thay vào đó tôi nên thử điều gì, tôi rất muốn nghe họ.
Nếu ai đó tò mò, tôi đã triển khai nó dưới dạng một bộ lọc WordPress như vậy:
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' );
Và để đầy đủ, đây là EXPLAIN
đầu ra cho truy vấn khi sử dụng STRAIGHT_JOIN
. Một lần nữa, tôi cảm thấy bối rối. Truy vấn cũ chỉ được sử dụng ref
và eq_ref
mà tôi hiểu là nhanh hơn range
, nhưng đây là mức độ nhanh hơn vì một số lý do.
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| 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 |
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+