2008-08-29 17 views
24

एक परिणाम को एक परिणाम को सीमित कर देगा, एक बड़े (आईएसएच) MySQL तालिका में प्रदर्शन को बेहतर करेगा यदि तालिका में केवल एक मिलान परिणाम है?प्रदर्शन को बेहतर बनाने में एक रिकॉर्ड को सीमित करना

उदाहरण

select * from people where name = "Re0sless" limit 1 

अगर उस नाम के साथ केवल एक रिकॉर्ड है के लिए

? और क्या name प्राथमिक कुंजी/अद्वितीय के लिए सेट था? और क्या यह क्वेरी अपडेट करने लायक है या लाभ कम होगा?

उत्तर

35

स्तंभ

एक अद्वितीय सूचकांक है: नहीं, यह कोई तेजी से

एक गैर-अद्वितीय सूचकांक: शायद, क्योंकि यह सबसे पहले मिलने वाला अलावा कोई अतिरिक्त पंक्तियों भेजने पाएगा, यदि कोई मौजूद

कोई सूचकांक: कभी कभी

  • यदि 1 या अधिक पंक्तियां क्वेरी से मेल खाते हैं, हाँ, क्योंकि पहली पंक्ति मिलान के बाद पूर्ण तालिका स्कैन रुक जाएगा।
  • अगर कोई भी पंक्ति क्वेरी, कोई, इसे पूरा करने की आवश्यकता होगी क्योंकि एक पूर्ण तालिका स्कैन
+2

क्या यह एक पूर्ण तालिका स्कैन को रोक देगा, या क्या यह पूर्ण तालिका स्कैन को जल्दी से बंद कर देगा? अगर रिकॉर्ड नहीं है, तो उसे अभी भी एक पूर्ण, पूर्ण टेबल स्कैन करना होगा। –

+2

हाँ, आप सही हैं। यह कहना चाहिए था कि यह एक पूर्ण टेबल स्कैन को रोक सकता है। मैं –

+4

पोस्ट को समायोजित करूँगा, जैसा कि मैं समझता हूं, महत्वपूर्ण बात यह है कि सीमा जोड़ने से आपकी क्वेरी तेज हो सकती है, लेकिन यह धीमी नहीं होगी। यदि कुछ और नहीं है, तो यह भविष्य के डेवलपर्स के लिए आपके इरादे को स्पष्ट रूप से टेलीग्राफ करने में भी कार्य करता है, अगर उन्हें ऐसी स्थिति को डीबग करना पड़ता है जहां आपकी परिस्थितियां उतनी ही अद्वितीय नहीं थी जितनी आपने सोचा था कि वे थे। जब भी मैं केवल एक परिणाम देता हूं, मैं हमेशा एक सीमा खंड जोड़ने की आदत बना देता हूं। यह सिर्फ यह पता लगाने के लिए दिमागी शक्ति को बर्बाद कर दिया गया है कि क्या पूर्व-मौजूदा इंडेक्स आपके लिए पहले से ही कर चुका होगा। – GrandOpener

0

मेरा मानना ​​है कि डेटा सेट मिलने के बाद एलआईटी कुछ किया गया है और परिणाम सेट बनाया जा रहा है, इसलिए मैं इससे कोई फर्क नहीं पड़ता। प्राथमिक कुंजी नाम बनाना महत्वपूर्ण सकारात्मक प्रभाव होगा हालांकि इसके परिणामस्वरूप कॉलम के लिए एक इंडेक्स बनाया जाएगा।

0

हैं "नाम" तालिका में अद्वितीय है से मेल खाते हैं, तो अभी भी एक (बहुत बहुत कम हो सकता है) अपनी क्वेरी पर सीमा बाधा डालकर प्रदर्शन में लाभ प्राप्त करें। यदि नाम प्राथमिक कुंजी है, तो संभवतः कोई भी नहीं होगा।

2

क्रम में अपने प्रश्नों के उत्तर देने के लिए: 1) हाँ, अगर नाम पर कोई अनुक्रमणिका नहीं है। जैसे ही यह पहला रिकॉर्ड पाता है, क्वेरी समाप्त हो जाएगी। सीमा हटाएं और इसे हर बार एक पूर्ण टेबल स्कैन करना होगा। 2) नहीं। प्राथमिक/अद्वितीय कुंजी अद्वितीय होने की गारंटी दी जाती है। जैसे ही यह पंक्ति पाता है, क्वेरी को चलना बंद कर देना चाहिए।

0

हां, डेटा से निपटने पर आपको एक प्रदर्शन अंतर दिखाई देगा। एक रिकॉर्ड कई रिकॉर्ड से कम जगह लेता है। जब तक आप कई पंक्तियों से निपट नहीं रहे हैं, यह कोई फर्क नहीं पड़ता है, लेकिन एक बार जब आप क्वेरी चलाते हैं, तो डेटा को आपको वापस प्रदर्शित किया जाना चाहिए, जो महंगा है, या प्रोग्रामेटिक रूप से निपटाया जाता है। किसी भी तरह से, एक रिकॉर्ड एकाधिक से आसान है।

3

यदि आपके पास एक या अधिक जोड़ों के साथ थोड़ा और जटिल प्रश्न है, तो LIMIT क्लॉज ऑप्टिमाइज़र अतिरिक्त जानकारी देता है। यदि यह दो तालिकाओं से मेल खाता है और सभी पंक्तियों को वापस करने की अपेक्षा करता है, तो hash join आमतौर पर इष्टतम है। एक हैश जॉइन बड़ी मात्रा में मिलान के लिए ऑप्टिमाइज़ किए गए एक प्रकार का है।

अब अगर अनुकूलक जानता है कि आपने LIMIT 1 पास कर दिया है, तो यह जानता है कि यह बड़ी मात्रा में डेटा संसाधित नहीं करेगा। यह loop join पर वापस जा सकता है।

डेटाबेस (और यहां तक ​​कि डेटाबेस संस्करण) के आधार पर इसका प्रदर्शन पर एक बड़ा प्रभाव हो सकता है।

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

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