2011-03-10 14 views
25

मैं MySQL 5.1 उपयोग कर रहा हूँ, और मैं एक प्रश्न प्रपत्र का लगभग है कि है:EXISTS COUNT (*)> 0 से अधिक कुशल है?

select count(*) from mytable where a = "foo" and b = "bar"; 

मेरे कार्यक्रम में, केवल एक चीज है कि यह जाँच करता है कि क्या यह शून्य या शून्य नहीं है। यदि मैं इसे परिवर्तित करता हूं:

select exists(select * from mytable where a = "foo" and b = "bar"); 

MySQL स्मार्ट है जो पहली बार हिट करते समय खोज बंद करने के लिए पर्याप्त है? या क्या MySQL से संवाद करने का कोई और तरीका है कि मेरा इरादा यह पता लगाने के लिए है कि क्या कोई रिकॉर्ड मेल खाता है, और मुझे सटीक गिनती की आवश्यकता नहीं है?

+5

दोनों प्रश्नों पर व्याख्या करने का प्रयास करें, आपको जवाब मिलना चाहिए। आप समझाओ आउटपुट पोस्ट कर सकते हैं और पीपीएल आपको डीकोड करने में मदद करेगा। – Zimbabao

+0

यह बेहद असंभव है कि MySQL को 'COUNT (*)> 0' अनुकूलित करने के बारे में पता चल जाएगा! – Gabe

+4

एएनएसआई मानक कहता है कि EXISTS बेहतर है क्योंकि इसे किसी पंक्ति के "अस्तित्व" से परे ट्रैवर्स या मूल्यांकन नहीं करना चाहिए http://stackoverflow.com/questions/3271455/whats-the-best-to-check-if-item-exist -या-not-select-countidor-exist/3271464 # 3271464 – gbn

उत्तर

26

हां, MySQL (वास्तव में जहां तक ​​मुझे पता है सभी डेटाबेस सिस्टम) एक कार्य समारोह का उपयोग करते समय एक पंक्ति लौटाए जाने पर प्रसंस्करण बंद कर देंगे।

आप MySQL प्रलेखन में अधिक पढ़ सकते हैं: If a subquery returns any rows at all, EXISTS subquery is TRUE.

+0

मुझे यकीन नहीं है कि SQLite अन्य सरल डेटाबेस के साथ करता है। –

+1

@ टीसी - हाँ। यहां तक ​​कि SQLLite करता है। यहां तक ​​कि पहुंच मैंने अभी तक ऐसे डेटाबेस में भाग नहीं लिया है जो नहीं था। – Thomas

+3

यह क्यों कम किया गया था? –

12

मैं 1000 प्रश्नों के साथ एक परीक्षण चल चुके हैं। SELECT EXISTSSELECT COUNT से लगभग 25% तेज था। limit 1 को SELECT COUNT में कोई फर्क नहीं पड़ता।

+15

'गिनती का चयन' करने के लिए 'सीमा 1' जोड़ना कोई फर्क नहीं पड़ता है, क्योंकि 'चयन गिनती' एक पंक्ति देता है। :-) – Ken

1

मुझे नहीं पता कि यह अनुकूलन के लिए कितना अच्छा काम करता है, लेकिन इसे exists के रूप में कार्य करना चाहिए। अपवाद यह है कि यदि कोई मैच नहीं है तो यह कोई पंक्ति नहीं लौटाएगा।

SELECT true from mytable where a = "foo" and b = "bar" LIMIT 1; 
+0

क्या वह संभावित रूप से एकाधिक पंक्तियों को वापस नहीं करेगा, प्रत्येक एक एकल मान 'सत्य' के साथ? –

+0

क्षमा करें मैं अपने संपादन में 'सीमा 1' भूल गया। यह बात बताने के लिए धन्यवाद! –

2

सबसे विश्वसनीय तरीका शायद LIMIT 1 है, लेकिन यह बात नहीं है।

बशर्ते आपके पास CREATE INDEX mytable_index_a_b ON mytable (a,b) जैसे इंडेक्स हों, MySQL इंडेक्स से गिनती वापस करने के लिए पर्याप्त स्मार्ट होना चाहिए और किसी भी पंक्ति को स्पर्श न करें। LIMIT 1 का लाभ शायद नगण्य है।

यदि आपके पास (ए, बी) पर कोई अनुक्रमणिका नहीं है, तो प्रदर्शन भयानक होगा। LIMIT 1 इसे काफी कम भयानक बना सकता है, लेकिन यह अभी भी भयानक होगा।

+0

ठीक है, मुझे विरासत कोडेबेस मिला है, और प्रदर्शन * भयानक है। :-) – Ken

+0

@ केन: यह डेटाबेस के माध्यम से जा सकता है और सूचकांक का एक बड़ा ढेर जोड़ सकता है –

+0

स्पष्ट अनुक्रमणिका पहले से मौजूद हैं, और इनमें से कुछ काफी बड़ी टेबल हैं जिन पर सम्मिलन प्रदर्शन महत्वपूर्ण है। – Ken

2

यह एक दृष्टिकोण भी हो सकता है।

select 1 from mytable where a = "foo" and b = "bar" limit 1; 

यह उस स्थिति को पूरा करने वाले सभी रिकॉर्डों का पता नहीं लगाएगा बल्कि पहले 'हिट' के बाद '1' वापस लौटाएगा। दोष आपको परिणाम की जांच करने की आवश्यकता है, क्योंकि बदले में खाली रिकॉर्ड सेट हो सकता है।

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