आप हमेशा EXPLAIN या EXPLAIN EXTENDED का उपयोग कर सकते हैं यह देखने के लिए कि MySql क्वेरी के साथ क्या कर रहा है
आप अपनी क्वेरी को थोड़ा अलग तरीके से भी लिख सकते हैं, क्या आपने निम्न कोशिश की है?
SELECT s.*,
sm.url AS media_url
FROM shows AS s
INNER JOIN show_medias AS sm ON s.id = SM.show_id
WHERE `s`.`id` IN (
SELECT DISTINCT st.show_id
FROM show_time_schedules AS sts
LEFT JOIN show_times AS st ON st.id = sts.show_time_id
WHERE sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date)
)
AND `s`.`is_active` = 1
AND sm.is_primary = 1
ORDER BY s.name asc
देखना दिलचस्प होगा कि इसका क्या असर होता है। मुझे उम्मीद है कि यह तेजी से होगा, इस समय, मुझे लगता है कि MySql आपके प्रत्येक शो के लिए आंतरिक क्वेरी 1 चलाएगा (ताकि एक क्वेरी कई बार चलाई जा सके। एक जुड़ाव अधिक कुशल होना चाहिए।)
INNER JOIN को LEFT JOIN से बदलें यदि आप ऐसे सभी शो चाहते हैं जिनकी show_medias में कोई पंक्ति नहीं है।
संपादित करें:
मैं शीघ्र ही आपके EXPLAIN EXTENDED पर एक नज़र डालूंगा, मुझे आश्चर्य है कि क्या आप निम्नलिखित को आज़माना चाहते हैं; यह सभी उपश्रेणियों को हटा देता है:
SELECT DISTINCT s.*,
sm.url AS media_url
FROM shows AS s
INNER JOIN show_medias AS sm ON s.id = SM.show_id
INNER JOIN show_times AS st ON (s.id = st.show_id)
RIGHT JOIN show_time_schedules AS sts ON (st.id = sts.show_time_id)
WHERE `s`.`is_active` = 1
AND sm.is_primary = 1
AND sts.schedule_date BETWEEN CAST('2012-01-10' AS date) AND CAST('2012-01-14' AS date)
ORDER BY s.name asc
(इन पर EXPLAIN EXTENDED देखना भी अच्छा होगा - आप इसे इसके लिए टिप्पणियों में जोड़ सकते हैं)।
आगे संपादित करें:
आपके EXPLAIN EXTENDED पर (इन्हें पढ़ने के तरीके के बारे में एक अच्छी शुरुआत यहाँ है )
FILESORT का उपयोग करना और अस्थायी का उपयोग करना दोनों प्रमुख संकेतक हैं। उम्मीद है, मेरे द्वारा सुझाई गई दूसरी क्वेरी को किसी भी अस्थायी तालिका (सबक्वायरी में) को हटा देना चाहिए। इसके बाद ORDER BY को बंद करके देखें कि क्या इससे कोई फर्क पड़ता है (और हम इसे अब तक के निष्कर्षों में जोड़ सकते हैं :-)
मैं यह भी देख सकता हूं कि बहुत सारे इंडेक्स लुकअप पर क्वेरी संभावित रूप से गायब है; आपके सभी आईडी कॉलम इंडेक्स मैचों के लिए प्रमुख उम्मीदवार हैं (सामान्य रूप से सूचकांक चेतावनी ) मैं उन इंडेक्स को जोड़ने की कोशिश करता हूं और फिर EXPLAIN EXTENDED को फिर से चलाकर देखता हूं कि अब क्या अंतर है (संपादित करें जैसा कि हम पहले से ही आपकी टिप्पणी से जानते हैं!)