2012-11-29 14 views
28

मैं एक घटना को ट्रैक प्रणाली है जो देखने तालिकाओं के एक मुट्ठी भर के साथ-साथ प्राथमिक प्रवेश तालिका का उपयोग करता पर काम कर रहा हूँ। एक रिपोर्ट में मैं लिख रहा हूं, आंकड़ों को देखने के लिए एक वस्तु का चयन किया जा सकता है। अंतर घटाने (यानी हिट) के क्रम में सभी ऑब्जेक्ट्स दिखाता है।, इंडेक्स का उपयोग करके अस्थायी उपयोग करते हुए, filesort का उपयोग कर - कैसे इसे ठीक करने के लिए?

दो तालिकाओं (थोड़ा कांट छांट, लेकिन आप सार मिलता है) के लिए स्कीमा:

CREATE TABLE IF NOT EXISTS `event_log` (
    `event_id` int(11) NOT NULL AUTO_INCREMENT, 
    `user_id` int(5) DEFAULT NULL, 
    `object_id` int(5) DEFAULT NULL, 
    `event_date` datetime DEFAULT NULL, 
    PRIMARY KEY (`event_id`), 
    KEY `user_id` (`user_id`), 
    KEY `object_id` (`object_id`) 
); 

CREATE TABLE IF NOT EXISTS `lookup_event_objects` (
    `object_id` int(11) NOT NULL AUTO_INCREMENT, 
    `object_desc` varchar(255) NOT NULL, 
    PRIMARY KEY (`object_id`) 
); 

क्वेरी मैं कुछ समस्या आ रही नीचे है। यह ~ 100 प्रविष्टियों की मेरी मेज के साथ ठीक काम करता है, लेकिन एक्सप्लाइन मुझे थोड़ा चिंतित करता है।

explain SELECT 
      el.object_id, 
      leo.object_desc, 
      COUNT(el.object_id) as count_rows 
     FROM 
      event_log el 
      LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id 
     GROUP BY 
      el.object_id 
     ORDER BY 
      count_rows DESC, 
      leo.object_desc ASC 

रिटर्न: Using index; Using temporary; Using filesort

तो - क्या मेरी स्कीमा और/या क्वेरी के साथ गलत क्या है MySQL temporary और filesort पर वापस गिर करने के लिए? या यह अनुकूलित के रूप में है क्योंकि यह ORDER BY का उपयोग कर सकता है? जब "अस्थायी का उपयोग करना"

उत्तर

63

खैर, the doc सटीक कारण देता दिखाई देगा:

अस्थायी टेबल इस प्रकार के शर्तों के तहत बनाया जा सकता है:

अगर वहाँ खंड और एक अलग एक ORDER BY है GROUP BY क्लॉज़, या यदि आदेश द्वारा या समूह द्वारा में शामिल होने के कतार में पहली तालिका के अलावा अन्य तालिकाओं से स्तंभ हैं, अस्थायी तालिका बनाई गई है।

DISTINCT अस्थायी तालिका की आवश्यकता हो सकती द्वारा आदेश के साथ संयुक्त।

आप SQL_SMALL_RESULT विकल्प का उपयोग करते, MySQL, एक में स्मृति अस्थायी तालिका का उपयोग करता है जब तक कि क्वेरी भी तत्वों ( वर्णित बाद में) है कि ऑन-डिस्क भंडारण की आवश्यकता होती है।

एक त्वरित स्कैन दिखाता है कि आप # 1 से पीड़ित हैं।

और this blog 2009 से कहता है कि "filesort का उपयोग कर" का अर्थ है उस तरह एक सूचकांक के साथ नहीं किया जा सकता। चूंकि आप एक गणना वाले क्षेत्र द्वारा ऑर्डर कर रहे हैं, यह भी सच होने जा रहा है।

तो, कि क्या "गलत" है।

+0

वस्तुओं मैंने कभी इस क्वेरी से लौटने चाहते हैं की अधिकतम संख्या हालांकि मैं संभवतः event_log में पंक्तियों के लाखों होगा <300, है। मैंने पुष्टि की कि 'अस्थायी' का उपयोग करना और 'फाइलोर्ट का उपयोग करना' दूर हो जाता है जब मैं ORDER BY को हटा देता हूं। मैं इसे बदलने की कोशिश करूंगा ताकि मैं स्क्रिप्टिंग भाषा (PHP) के साथ ऑर्डरिंग (सरणी में) कर सकूं। आपकी प्रतिक्रिया और लिंक के लिए धन्यवाद। –

+1

यह अभी भी MySQL में सॉर्टिंग करने के लिए और अधिक कुशल हो सकता है - इसमें पहले से ही डेटा संरचना में लोड किया गया डेटा है, –

+0

यह निश्चित रूप से क्लीनर होगा। प्रतिक्रिया के लिए धन्यवाद। –

1

ये निम्न शर्तों के तहत अस्थायी टेबल बनाई गई हैं कर रहे हैं। यूनियन प्रश्न अस्थायी तालिकाओं का उपयोग करते हैं।

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

यदि खंड द्वारा एक ऑर्डर और क्लॉज द्वारा एक अलग समूह है, या यदि ऑर्डर द्वारा या ग्रुप बाय में शामिल कतार में पहली तालिका के अलावा टेबल से कॉलम हैं, तो एक अस्थायी तालिका बनाई जाती है।

DISTINCT अस्थायी तालिका की आवश्यकता हो सकती द्वारा आदेश के साथ संयुक्त।

आप SQL_SMALL_RESULT विकल्प का उपयोग करते, MySQL, एक में स्मृति अस्थायी तालिका का उपयोग करता है जब तक कि क्वेरी भी तत्वों (बाद में बताया गया है) कि ऑन-डिस्क भंडारण की आवश्यकता होती है। http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html

1

MySQL 5.7 के लिए अद्यतन (src):

  • का मूल्यांकन:

    सर्वर इस तरह के शर्तों के तहत अस्थायी तालिकाओं बनाता

    mysql द्वारा इस लिंक का पालन करें बाद में वर्णित कुछ अपवादों के साथ यूनियन स्टेटमेंट्स।

  • कुछ विचारों का मूल्यांकन, जैसे टेम्पलेट एल्गोरिदम, यूनियन या समेकन का उपयोग करना।

  • व्युत्पन्न तालिकाओं का मूल्यांकन (खंड से उपखंड)।

  • सबक्वायरी या सेमी-जॉइन भौतिकरण के लिए बनाए गए टेबल्स (अनुभाग 8.2.2, "ऑप्टिमाइज़िंग सबक्विरीज़, व्युत्पन्न टेबल्स, और व्यू संदर्भ" देखें)।

  • खंडों का मूल्यांकन और खंड द्वारा एक अलग समूह, या जिसके लिए ऑर्डर द्वारा या ग्रुप बाय में शामिल कतार में पहली तालिका के अलावा अन्य तालिकाओं के कॉलम शामिल हैं।

  • ORDER BY के साथ संयुक्त DISTINCT का मूल्यांकन एक अस्थायी तालिका की आवश्यकता हो सकती है।

  • SQL_SMALL_RESULT संशोधक का उपयोग करने वाले प्रश्नों के लिए, MySQL एक इन-मेमोरी अस्थायी तालिका का उपयोग करता है, जब तक कि क्वेरी में तत्व (बाद में वर्णित) भी शामिल हो, जिसके लिए डिस्क संग्रहण की आवश्यकता होती है।

  • INSERT का मूल्यांकन करने के लिए ... चयन तालिका जो एक ही तालिका में से चुनें और डालें, MySQL SELECT से पंक्तियों को पकड़ने के लिए एक आंतरिक अस्थायी तालिका बनाता है, फिर उन पंक्तियों को लक्ष्य तालिका में डालें। खंड 13.2.5.1, "INSERT ... चयन सिंटेक्स" देखें।

  • एकाधिक-तालिका अद्यतन विवरणों का मूल्यांकन।

  • GROUP_CONCAT() या COUNT (DISTINCT) अभिव्यक्तियों का मूल्यांकन।

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