2009-12-06 14 views
9

एक InnoDB भंडारण के लिए यह याMySQL गिनती पंक्तियों के प्रदर्शन

select * from tbl where pk = 1 

पर

  • mysql_num_rows का उपयोग करना द्वारा रिकॉर्ड की कुल संख्या गिनती

    • से बेहतर है

      सरणी लाने और पीछे हटाना rieve

      select count(*) as total from tbl where pk = 1 
      

    से "कुल" मूल्य?

उत्तर

13

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

explain यहां सहायता कर सकते हैं। इस मामले में, यह आपको बताएगा कि चयन को अनुकूलित किया गया है।

1

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

+1

MySQL वास्तव में डाटा संचारित नहीं है इससे पहले कि आप कहते हैं ' – Andomar

+0

mysql_fetch_array' ताकि मामले में क्यों पहले नहीं है एक बेहतर? – Wolfgang

+0

MySQL के पास अभी भी क्वेरी परिणाम पूरी तरह से प्राप्त होने तक क्वेरी परिणामों को बफर्ड किया जाएगा। –

4

Zxpro के जवाब के अलावा, वहाँ भी MySQL आंतरिक प्रयास है:

select * from tbl where pk = 1 

बलों MySQL शारीरिक रूप से पंक्तियों से मेल खाते को पुनः प्राप्त करने के लिए; जबकि

select count(*) as total from tbl where pk = 1 

किसी भी तालिका पंक्तियों

1

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

लेकिन हां, उत्तरार्द्ध।

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

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