2016-02-26 6 views
6

गिनती (आईडी) की तुलना में बेहतर प्रदर्शन किया है पहले तो मुझे गिनती (*) की तुलना करने और (आईडी) गिनती चाहते हैं, जो बेहतर प्रदर्शन है?क्यों mysql गिनती (*)

mysql संस्करण

5.6.21-1~dotdeb.1-log 

तालिका जानकारी

PRIMARY KEY (`id`), 
KEY `is_availability` (`is_availability`,`is_del`) 
ENGINE=InnoDB AUTO_INCREMENT=48993819 DEFAULT CHARSET=utf8 
  1. तुलना के बिना जहां हालत

    select count(*) from op_log; 
    +----------+ 
    | count(*) | 
    +----------+ 
    | 48989975 | 
    +----------+ 
    1 row in set (10.02 sec) 
    
    select count(id) from op_log ; 
    +-----------+ 
    | count(id) | 
    +-----------+ 
    | 48989990 | 
    +-----------+ 
    1 row in set (12.05 sec) 
    

count(*) की तुलना में बेहतर count(id)

  1. जहां हालत

    select count(*) from op_log where is_availability=1; 
    +----------+ 
    | count(*) | 
    +----------+ 
    | 48990038 | 
    +----------+ 
    1 row in set (15.86 sec) 
    select count(id) from op_log where is_availability=1; 
    +-----------+ 
    | count(id) | 
    +-----------+ 
    | 48990096 | 
    +-----------+ 
    1 row in set (17.13 sec) 
    

    count(*) अभी भी की तुलना में बेहतर count(id)

तो साथ तुलना अगर मैं निष्कर्ष है कि count(*) आकर्षित कर सकता है count(id) से बेहतर प्रदर्शन है और यह क्यों है?

High Performance MySQL से, मैं

मिला अगर mysql जानता है कुछ col नल नहीं हो सकता है, यह गणना (col) को अनुकूलित करेंगे गिनती करने के लिए (*) आंतरिक रूप से

तो मैं उस समय खर्च पर शक इस अनुकूलन कार्य करने के लिए और अधिक उपयोग किया जाता है।

+1

'id' कैसे परिभाषित किया गया है? – Matthew

+1

खोज आपका मित्र है: https://duckduckgo.com/?q=mysql+count+performance&t=ffsb - इसमें बहुत से ब्लॉग पोस्ट शामिल हैं। – Augusto

+1

mysql में [तेज़, गिनती (\ *) या गिनती (तालिका \ _field \ _name) की संभावित डुप्लिकेट?] (Http://stackoverflow.com/questions/7515531/whats-faster-count-or-counttable-field -name-इन-mysql) – Augusto

उत्तर

8

अक्सर COUNT(*) मामूली बेहतर प्रदर्शन करना होगा। COUNT(id) को यह जांचने की आवश्यकता है कि idNULL यह काम करने के लिए नहीं है। इसका मतलब है कि इसे मूल्य को पढ़ने की आवश्यकता है (साथ ही NULL नेस की जांच के लिए छोटे ओवरहेड)।

मैं समय सबसे डेटाबेस में समान होने की अपेक्षा है जब id एक संकुल प्राथमिक कुंजी है। हालांकि, शायद MySQL ऑप्टिमाइज़र NOT NULL घोषित कॉलम के लिए भी NULL से बचने से परेशान नहीं है।

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

+0

हाँ, उच्च निष्पादन MySQL से, मुझे मिला: "अगर mysql जानता है कि कुछ कर्नल न्यूल नहीं हो सकता है, तो यह आंतरिक रूप से गिनती (*) को गिनने के लिए गिनती (कोला) को अनुकूलित करेगा। इसलिए मुझे संदेह है कि इस अनुकूलन कार्य को करने के लिए अधिक समय व्यतीत किया जाता है। – zhuguowei

4

COUNT (*) अपनी मेज

COUNT (स्तंभ) की सभी पंक्तियों की संख्या में केवल अपनी मेज के गैर NULLs स्तंभों में गिना जाएगा।

आप इस article जाँच कर सकते हैं:

बात गिनती है (*) क्वेरी सूचकांक यहाँ तक कि जब गणना (col) को कवर नहीं कर सकते हैं का उपयोग कर सकते हैं।बेशक आप सूचकांक विस्तार कर सकते हैं होने के लिए (i, वैल) और क्वेरी मिल सूचकांक फिर से शामिल किए जाने वाले, लेकिन मैं इस समाधान का केवल उपयोग करें यदि आप क्वेरी नहीं बदल सकते हैं (यानी यह तृतीय पक्ष एप्लिकेशन है) या मामले में कॉलम नाम कारण के लिए क्वेरी में है, और आपको वास्तव में गैर-नल मानों की की गणना करने की आवश्यकता है।

0

इस गिनती (*) विफल 1 कहते हैं और है 0 this Fails say 1 and is 0

सब तय किया गया था, दूसरी तालिका के गिनती आईडी से !!!

enter image description here

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