Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL क्वेरी ऑप्टिमाइज़ेशन - आंतरिक प्रश्न

आप हमेशा 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 को फिर से चलाकर देखता हूं कि अब क्या अंतर है (संपादित करें जैसा कि हम पहले से ही आपकी टिप्पणी से जानते हैं!)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या तैयार क्वेरी को देखने का कोई तरीका है क्योंकि इसे डेटाबेस पर निष्पादित किया जाएगा?

  2. क्वेरी mysql और PHP में CSV के रूप में डेटा निर्यात करें

  3. एक बहु किरायेदार mysql डेटाबेस कैसे डिज़ाइन करें

  4. MySQL डीबी के साथ रेल में सर्वर प्रारंभ करने में असमर्थ

  5. MySQL SELECT AS दो कॉलम को एक में मिलाता है