जिस "समाधान" पर मैंने अभी ठोकर खाई है, वह बहुत बदसूरत है, लेकिन कुछ अकथनीय कारणों से, यह काम करता है। STRAIGHT_JOIN
जोड़ना ऑप्टिमाइज़र हिंट ने निष्पादन समय को 18+ सेकंड से घटाकर लगभग 0.0022 सेकंड कर दिया। सामान्य ज्ञान और इस प्रश्न के आधार पर (MySQL के साथ STRAIGHT_JOIN का उपयोग कब करें
), यह समाधान एक बुरे विचार की तरह लगता है, लेकिन यह एकमात्र चीज है जिसे मैंने आजमाया है जिसने काम किया है। इसलिए, कम से कम अभी के लिए, मैं इस पर कायम हूं। अगर किसी के पास कोई विचार है कि मुझे ऐसा क्यों नहीं करना चाहिए, या इसके बजाय मुझे क्या प्रयास करना चाहिए, तो मुझे उन्हें सुनना अच्छा लगेगा।
अगर कोई उत्सुक है, तो मैंने इसे वर्डप्रेस फ़िल्टर के रूप में लागू किया है:
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' );
और पूर्णता के लिए, यहाँ EXPLAIN
है STRAIGHT_JOIN
. का उपयोग करते समय क्वेरी के लिए आउटपुट . फिर से, मैं चकित हूँ। पुरानी क्वेरी में केवल ref
का उपयोग किया गया था और eq_ref
जिसे मैं range
. से तेज समझता हूं , लेकिन यह किसी कारण से तेजी से परिमाण का क्रम है।
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+
| 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 |
+-----+--------------+------------------------+--------+---------------------------+-------------------+----------+-----------------+-------+----------------------------------------------+