देखें कि क्या EXPLAIN EXTENDED
कहते हैं।
अगर यह DEPENDENT SUBQUERY
says कहता है या UNCACHEABLE SUBQUERY
, तो इसका हर बार उपयोग किए जाने पर इसका पुनर्मूल्यांकन किया जाएगा।
ऐसा तब होता है जब सबक्वेरी सत्र चर का उपयोग करती है या एक सहसंबद्ध सबक्वेरी है।
अगर ऐसा नहीं होता है, तो संभवत:इसे कैश कर लिया जाएगा।
यदि आपके मामले में सबक्वेरी कैश नहीं की जाएगी, तो इसका प्रत्येक UNION
में पुनर्मूल्यांकन किया जाएगा एड सेट।
हालाँकि, आप सबक्वेरी बहुत जटिल प्रतीत होते हैं। आप इसका उपयोग क्यों नहीं करते:
SELECT id
FROM playlist_program_map ppm, programs p
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND submitter_id = 32
AND feed_id = 2478
यदि आपके पास playlist_program_map (playlist_id)
. पर एक अनुक्रमणिका है , यह प्रश्न एक आकर्षण की तरह काम करना चाहिए।
क्या आप कृपया मुझे दो और बातें बता सकते हैं:
playlist_program_map
में कितनी पंक्तियाँ हैं और कितनेDISTINCT playlist_id
मान मौजूद हैं?programs
में कितनी पंक्तियाँ होती हैं और कितनेDISTINCT submitter_id, feed_id
जोड़े हैं?
आपकी टिप्पणी से मैं यह निष्कर्ष निकाल सकता हूं कि 10 . हैं programs
प्रति playlist
औसतन, और 200 programs
प्रति (submitter, feed)
जोड़ा। इसका मतलब है कि playlist_program_map
. पर आपकी अनुक्रमणिका (submitter, feed)
. की तुलना में अधिक चयनात्मक है , और playlist_program_map
शामिल होने में अग्रणी होना चाहिए।
आपके मामले में पूर्ण पाठ अनुक्रमणिका भी बहुत चयनात्मक नहीं लगती, यह देखते हुए कि आपको 10 में शामिल होने की आवश्यकता है 2,000,000 . में से कार्यक्रम ।
आप बेहतर तरीके से निम्न कोशिश कर सकते हैं:
SELECT object_id, programs.created AS created
FROM playlist_program_map ppm, programs p, comments_programs cp
WHERE ppm.playlist_id = 181
AND p.id = ppm.program_id
AND p.submitter_id = 32
AND p.feed_id = 2478
AND cp.object_id = p.id
AND cp.text REGEXP 'excellent'
, और इसे तीनों तालिकाओं के लिए दोहराएं।