क्या MySQL के प्रश्नों में 'लिमिट 1' को जोड़ने से वे तेजी से बनते हैं जब आप जानते हैं कि केवल 1 परिणाम होगा?


86

जब मैं एक MySQL क्वेरी में LIMIT 1 को जोड़ता हूं, तो क्या यह खोज को रोक देता है क्योंकि यह 1 परिणाम पाता है (इस प्रकार इसे तेजी से बना रहा है) या क्या यह अभी भी सभी परिणामों को प्राप्त करता है और अंत में टुकड़े टुकड़े करता है?


1
यदि फ़िल्टर कॉलम पर कोई UNIQUE(या PRIMARY KEY) बाधा (या सूचकांक) नहीं है। stackoverflow.com/questions/8467092/…
ma11hew28

जवाबों:


81

क्वेरी के आधार पर, एक सीमा क्लॉज जोड़ने से प्रदर्शन पर भारी प्रभाव पड़ सकता है। यदि आप केवल एक पंक्ति चाहते हैं (या इस तथ्य के लिए जानते हैं कि केवल एक पंक्ति क्वेरी को संतुष्ट कर सकती है), और इस बारे में निश्चित नहीं हैं कि आंतरिक ऑप्टिमाइज़र इसे कैसे निष्पादित करेगा (उदाहरण के लिए, तो जहां कोई सूचकांक और आगे नहीं मार रहा है), तो आपको निश्चित रूप से एक लिमिट खंड जोड़ना चाहिए।

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


30
एन्टीबगिंग प्रयोजनों के लिए आप लिमिट 2 भेजने पर विचार करना चाहते हैं और फिर शिकायत कर सकते हैं या यदि आपकी एकल-पंक्ति धारणा पकड़ में नहीं आती है तो बम विस्फोट करें।
जेफरी हेंटिन

6
@ जेफ्रीहैंटिन यदि वास्तव में केवल एक ही हो सकता है तो आपको डेटाबेस में एक अद्वितीय बाधा जोड़ना पसंद करना चाहिए। बहुत क्लीनर तो स्वच्छता जांच के साथ अपने कोड को गड़बड़ कर रहा है।
21:39 पर क्रिस्टियन Vrabie

@CristianVrabie यदि इसे एक अद्वितीय बाधा के रूप में व्यक्त किया जा सकता है, तो निश्चित है, लेकिन यह तालिकाओं में डेटा के बारे में एक जोर है। LIMIT 2 को भेजना और 1 के लिए जाँच करना ही उस क्वेरी के बारे में जोर देता है, जिसमें बहुत अच्छी तरह से बग हो सकता है जैसे कि एक अपर्याप्त निर्दिष्ट शर्त।
जेफरी हेन्टिन

1
@JeffreyHantin फेयर पर्याप्त है, लेकिन सिवाय इसके कि अगर आप मार्स रोवर के लिए कोड देते हैं तो आप इसके लिए परीक्षण लिखते हैं, फिर अपने कोड को प्रदूषित करते हैं।
क्रिस्चियन Vrabie

8
@ जेफ्रीहैंटिन यदि यह धारणा कि केवल एक ही सही है, तो लिमिट 2 को जोड़ना कोई अनुकूलन नहीं होगा क्योंकि यह सभी पंक्तियों की खोज करेगा? उस मामले में लिमिट 2 को जोड़ना किसी भी चीज में जोड़ने से बेहतर (अनुकूलन-वार) नहीं है।
क्रिस मिडलटन

19

सीमा क्वेरी के प्रदर्शन को प्रभावित कर सकती है (टिप्पणियों और नीचे दिए गए लिंक देखें) और यह MySQL द्वारा आउटपुट परिणाम सेट को भी कम कर देता है। ऐसी क्वेरी के लिए जिसमें आप एकल परिणाम की अपेक्षा करते हैं, लाभ है।

इसके अलावा, परिणाम सेट को सीमित करना वास्तव में कुल क्वेरी समय को गति दे सकता है क्योंकि बड़े परिणाम सेट का उपयोग मेमोरी और संभावित रूप से डिस्क पर अस्थायी तालिकाओं का निर्माण करता है। मैं इसका उल्लेख करता हूं क्योंकि मैंने हाल ही में एक एप्लिकेशन देखा था जो विशाल परिणाम सेट के कारण सर्वर को मारता है और सीमित संसाधन के साथ संसाधन उपयोग जबरदस्त रूप से गिरा देता है।

अधिक विवरण के लिए इस पृष्ठ की जाँच करें: MySQL प्रलेखन: सीमा अनुकूलन


आपके द्वारा जोड़ा गया पृष्ठ कहता है: "यदि आप लिमिट के साथ केवल कुछ पंक्तियों का चयन कर रहे हैं, तो MySQL कुछ मामलों में अनुक्रमित का उपयोग करता है जब सामान्य रूप से यह एक पूर्ण तालिका स्कैन करना पसंद करेगा।" ऐसा नहीं लगता कि क्वेरी हमेशा की तरह ही संसाधित होती है।
चे

अच्छी बात। मैं EXPLAIN के उपयोग से टिप्पणियों के आधार पर एक सामान्यीकरण कर रहा था। पकड़ने के लिए धन्यवाद।
rjamestaylor

लिंक की बहुत सराहना की है। एफडब्ल्यूआईडब्ल्यू, इस उत्तर का अधिकांश उन स्थितियों पर लागू होता है जहां सीमा के बिना, एक बड़ा परिणाम सेट हो सकता है । प्रश्न पूछ रहा है कि क्या यह मायने रखता है जब केवल 1 पंक्ति कभी भी सफलतापूर्वक मेल खाएगी; जिस स्थिति में "परिणाम सेट" केवल 1 पंक्ति (यहां तक ​​कि w / o सीमा) है।
टूलमेकरसेव

5

यदि केवल 1 परिणाम वापस आ रहा है, तो नहीं, लिमिट इसे और तेज नहीं करेगा। यदि बहुत सारे परिणाम हैं, और आपको केवल पहले परिणाम की आवश्यकता है, और बयानों द्वारा कोई समूह या आदेश नहीं है तो लिमिट इसे तेज कर देगा।


2
यह 1 पंक्ति के साथ भी तेज होना चाहिए, अगर कोई अनोखी / प्राथमिक कुंजी नहीं है, क्योंकि यह पहली घटना होने के बाद खोजना बंद कर देता है
The_nuts

क्रिश, आपका पहला वाक्य एक दो तरीकों से पढ़ा जा सकता है। यदि आपका मतलब है "केवल 1 पंक्ति को संभवतः कभी भी लौटाया जा सकता है" (उदाहरण के लिए एक अद्वितीय कॉलम क्वेरी), तो आप जो कहते हैं वह सच है। OTOH, यदि आपका मतलब है "जब भी केवल 1 मिलान परिणाम पाया जाता है" सीमा इसे तेज नहीं करेगी: क्या आप सुनिश्चित हैं? क्या यह कभी-कभी अतिरिक्त पृष्ठों में खींचने से बचता है?
टूलमेकरसेव

5

जवाब, संक्षेप में, हाँ है। यदि आप अपने परिणाम को 1 तक सीमित करते हैं, तो भले ही आप एक परिणाम की "उम्मीद" कर रहे हों, क्वेरी तेज़ होगी क्योंकि आपका डेटाबेस आपके सभी रिकॉर्डों को नहीं देखेगा। एक बार रिकॉर्ड करने के बाद यह बस रुक जाएगा जो आपकी क्वेरी से मेल खाता है।


1
यह उत्तर भ्रामक है, क्योंकि इसमें अन्य उत्तरों (7 साल पहले!) पर टिप्पणियों में देखे गए चेतावनी का अभाव है, अगर डीबी जानता है कि केवल एक रिकॉर्ड संभवतः मेल कर सकता है (उदाहरण के लिए एक अद्वितीय कॉलम क्वेरी), तो सीमा 1 का कोई प्रभाव नहीं होगा।
टूलमेकरसेव

गंभीरता से? क्वेरी ऑप्टिमाइज़र इस तथ्य का लाभ उठा सकता है कि कुछ शर्तें गारंटी देती हैं कि केवल 1 रिकॉर्ड को संभवतः वापस किया जा सकता है। मैं इंगित कर रहा था कि आपका उत्तर सभी परिस्थितियों में सही नहीं है। (और इसलिए वर्षों से पहले ही कही गई बात से मूल्य घटा दिया गया है।) यदि आप सहमत हैं, तो आप मेरी टिप्पणी की शुद्धता को स्वीकार कर सकते हैं। यदि आप सहमत नहीं हैं, तो आप स्पष्ट कर सकते हैं कि क्यों।
टूलमेकरसेव

1

यदि आप वास्तव में केवल एक ही परिणाम की उम्मीद करते हैं, तो यह वास्तव में आपकी क्वेरी के लिमिट को जोड़ने के लिए समझ में आता है। मैं MySQL के आंतरिक कामकाज को नहीं जानता, लेकिन मुझे यकीन है कि यह 100'000 + रिकॉर्ड के परिणाम को इकट्ठा नहीं करेगा, इसे अंत में 1 पर वापस लाने के लिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.