गणना (*) धीमी क्यों है, जब स्पष्टीकरण का उत्तर पता है?


14

यह क्वेरी: select count(*) from planner_eventचलने में बहुत लंबा समय लेती है - इतनी देर, मैंने इसे खत्म करने से पहले इसे छोड़ दिया और मार दिया। हालांकि, जब मैं दौड़ता हूं, तो मैं explain select count(*) from planner_eventपंक्तियों की संख्या (14 मीटर) के साथ आउटपुट में एक कॉलम देख सकता हूं।

कैसे समझाएँ पंक्तियों की संख्या तुरन्त मिल सकती है, लेकिन गिनती (*) को चलने में लंबा समय लगता है?


बिना किसी कारण के COUNT (*) के कारण InnoDB इंजन पर एक टेबल स्कैन हो जाएगा .. MyISAM काउंट को सीधे डिलीवर कर सकता है क्योंकि COUNT टेबल से डी हेडर फ़ाइल में keept है।
रेमंड निजलैंड

जवाबों:


16

समझाएं कि पहले से एकत्रित आँकड़े (क्वेरी ऑप्टिमाइज़र द्वारा प्रयुक्त) का उपयोग किया जा रहा है। रीडिंग select count(*)एवर डेटा ब्लॉक।

यहाँ एक अनुमानित पंक्ति गणना प्राप्त करने का एक सस्ता तरीका है:

select TABLE_ROWS FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME='planner_event';

यदि आपने किया था select count(id), तब भी आपको बहुत लंबा समय लग सकता है, जब तक कि आपके पास एक द्वितीयक सूचकांक नहीं है id(यह भी मान लें idकि एक प्राथमिक कुंजी है)। क्योंकि सभी डेटा (पंक्ति डेटा सहित) को बी-ट्री इंडेक्स में संग्रहीत किया जाता है, select count(PK_COLUMN)जो अभी भी IO की काफी मात्रा है (सभी डेटा पृष्ठों को पढ़ने की आवश्यकता है)। यदि आपके पास पीके क्षेत्र पर एक द्वितीयक सूचकांक है, तो यह एक गणना करने के लिए कम IO प्रदर्शन करने में सक्षम होगा।


I_S.TABLES आपको वही अनुमानEXPLAIN देता है जो आपको देता है।
रिक जेम्स

AND TABLE_SCHEMA='my_database'यदि आप किसी अन्य डेटाबेस में समान नाम वाली तालिका रखते हैं, तो क्वेरी अनुपलब्ध है , अन्यथा आपको कई परिणाम वापस मिलेंगे।
cz

3

समझाएं कि कुछ "आँकड़ों" से संख्या प्राप्त होती है जो कि ऑप्टिमाइज़र के लिए चीजों का अनुमान लगाने के लिए उपयोग की जाती हैं। यह संख्या सही से बहुत दूर हो सकती है - मैं कभी-कभी इसे सटीक मान की तुलना में 2 (उच्च या निम्न) के कारक से अधिक देखता हूं।

COUNT(*)इनकोबीडी टेबल पर प्रदर्शन करना टेबल को स्कैन करना चाहिए ताकि अन्य कनेक्शनों द्वारा डाले / हटाए गए व्यस्त रिकॉर्ड से बचने के लिए लेकिन अभी तक "प्रतिबद्ध" न हो। वास्तव में, यह कुछ सूचकांक पर एक पूर्ण स्कैन करने के लिए पर्याप्त है, जरूरी नहीं कि पूरी तालिका (जिसमें शामिल हो PRIMARY KEY)।

आपके पास कितना रैम है? का मूल्य क्या है innodb_buffer_pool_size? यह मदद कर सकता है अगर वह लगभग 70% रैम था।

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