php
  • mysql
  • performance
  • 2012-03-29 21 views 29 likes 
    29

    के लिए "बनाम" खंड बनाम बराबर (=) यह एक बहुत ही सरल सवाल है और मुझे लगता है कि जवाब "इससे कोई फर्क नहीं पड़ता" है लेकिन मुझे वैसे भी पूछना है ... बजाय निम्नलिखितMySQL प्रदर्शन - एकल मूल्य

    $sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')'; 
    

    मान लिया जाये कि पूर्व वैधता चेक ($object_ids कम से कम 1 आइटम और सभी संख्यात्मक मान के साथ एक सारणी है), मुझे क्या करना चाहिए:

    मैं एक सामान्य एसक्यूएल बयान पीएचपी में बनाया गया है?

    if(count($object_ids) == 1) { 
        $sql = 'SELECT * FROM `users` WHERE `id` = ' . array_shift($object_ids); 
    } else { 
        $sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')'; 
    } 
    

    या count($object_ids) लायक नहीं क्या (यदि कोई हो सब पर) वास्तविक एसक्यूएल बयान में बचाया जाएगा जाँच की भूमि के ऊपर है?

    +0

    आपने अपने प्रश्न का उत्तर दिया :) इससे कोई फर्क नहीं पड़ता। सरणी के आकार की जांच किए बिना 'implode' का उपयोग करना भी आसान है। –

    +1

    @ एनबी। क्या किसी ने कभी आपको बताया है कि आपका नाम टिप्पणियों के लिए बिल्कुल सही है: पी – mellamokb

    +0

    @mellamokb - अब किसी ने किया :) –

    उत्तर

    14

    उनमें से कोई भी चीजों के बड़े दायरे में वास्तव में महत्वपूर्ण नहीं है। डेटाबेस के साथ संचार करने में नेटवर्क विलंबता count($object_ids) ओवरहेड या = बनाम IN ओवरहेड से कहीं अधिक हो जाएगी। मैं इसे समयपूर्व अनुकूलन का मामला कहूंगा।

    आपको वास्तविक बाधाओं को जानने के लिए अपने आवेदन को प्रोफ़ाइल और लोड-टेस्ट करना चाहिए।

    +0

    धन्यवाद होगा, बस कुछ आश्वासन की आवश्यकता है – JudRoman

    +0

    यह वास्तव में सवाल का जवाब नहीं दिया !! –

    23

    MySQL कथन के बीच कोई अंतर नहीं है, और MySQL ऑप्टिमाइज़र IN को = में बदल देगा जब IN केवल एक तत्व है। भेजा मत खा।

    +4

    क्या आप अपने दावे की पुष्टि करने के लिए कुछ MySQL आधिकारिक जानकारी ला सकते हैं? क्या आप पूरी तरह से सुनिश्चित हैं कि MySQL ऑप्टिमाइज़र ने इसे समझाया है जैसा आपने समझाया है? – Delmo

    +2

    यह सच नहीं है, मैं समझाया गया कथन के साथ क्वेरी चलाता हूं और उत्तर के रूप में स्क्रीनशॉट पोस्ट करता हूं – mes

    3

    मैं कल्पना है कि आंतरिक रूप से mysql IN (6) जिज्ञासा व्यवहार करेगा एक = 6 प्रश्न के रूप में तो कोई परेशान करने के लिए (इस तरह से समय से पहले अनुकूलन कहा जाता है) एक बयान की व्याख्या के साथ दो प्रश्नों की जरूरत

    7

    भागो नहीं है। यह आपको दिखाएगा कि MySQL क्या कर रहा है। MySQL अनुकूलन पर ध्यान केंद्रित करना चाहिए MySQL क्वेरी के साथ आंतरिक रूप से क्या करना चाहिए। अनुकूलित करने की कोशिश कर रहा है कि कौन सी क्वेरी निष्पादित की जाती है थोड़ा सा समय है।

    उदाहरण के लिए कोई अनुक्रमणिका नहीं होने पर ये दोनों प्रश्न प्रदर्शन में भयानक हो सकते हैं। MySQL का एक्सप्लाइन स्टेटमेंट यहां सोना है। तो जब आप एक क्वेरी पर जाते हैं जो धीमा चल रहा है तो EXPLAIN कथन आपको दिखाएगा क्यों।

    0

    मैं बयान की व्याख्या के साथ क्वेरी चलाने और यहां परिणाम सभी पंक्तियों enter image description here

    यह स्पष्ट है कि "बराबर है" ऑपरेटर बेहतर है, यह 13 पंक्ति को स्कैन करता है, और है "में" स्कैन कर रहे हैं

    +1

    आपकी क्वेरी में एक सबक्वायरी है, इसलिए यह एक आइटम के साथ 'IN' के अनुकूलन का संकेत नहीं है – Vadim

    35

    के अधिकांश अन्य उत्तर कुछ निर्णायक, केवल अटकलें प्रदान नहीं करते हैं। तो, good advice from @Namphibian's answer के आधार पर, मैंने OP में किसी के समान कुछ प्रश्नों पर EXPLAIN चलाया।

    परिणाम में नीचे हैं:


    एक प्रश्न के लिए EXPLAIN= 1 साथ:

    Explain for a query with <code>= 1</code>


    एक प्रश्न के लिए IN(1) साथ EXPLAIN:

    Explain for a query with <code>IN(1)</code>


    IN(1,2,3) साथ एक प्रश्न के लिए EXPLAIN:

    Explain for a query with <code>IN(1,2,3)</code>


    आप देख सकते हैं, MySQL IN(1) अनुकूलन क्वेरी की इस तरह में = 1 के बराबर हो जाए करता है। @mes's answer इंगित करता है कि यह हमेशा जटिल प्रश्नों के साथ मामला नहीं हो सकता है।

    तो, उन लोगों के लिए जो EXPLAIN स्वयं चलाने के लिए बहुत आलसी थे, अब आप जानते हैं। और हां, आप यह सुनिश्चित करने के लिए EXPLAIN को अपनी खुद की क्वेरी पर चलाने के लिए चाहते हैं कि यह इस तरह से संभाला जा सके। :-)

    संबंधित मुद्दे