2010-03-17 25 views
7

मैंने माईएसQL संदर्भ मैनुअल से पढ़ा और पाया कि जब यह इंडेक्स का उपयोग कर सकता है, तो यह केवल इंडेक्स स्कैन करता है, अन्य यह टीएमपी टेबल बनाएगा और फाइलोर्ट जैसी चीजें करेगा। और मैंने अन्य आलेख से भी पढ़ा है कि "ग्रुप बाय" परिणाम डिफ़ॉल्ट रूप से कॉलम द्वारा समूह द्वारा सॉर्ट करेगा, अगर "शून्य द्वारा ऑर्डर" खंड जोड़ा गया है, तो यह फाइलोर्ट नहीं करेगा। अंतर "व्याख्या ..." खंड से पाया जा सकता है। इसलिए मेरी समस्या यह है कि "समूह द्वारा" खंड के बीच अंतर क्या है "ऑर्डर द्वारा नल" और जिसमें नहीं है?MySQL कैसे "समूह द्वारा" लागू करता है?

result for group clause without order by null: 
|preparing      | 0.000016 | 
| Creating tmp table    | 0.000048 | 
| executing      | 0.000009 | 
| Copying to tmp table   | 0.000109 | 
**| Sorting result     | 0.000023 |** 
| Sending data     | 0.000027 | 

result for clause with "order by null": 
preparing      | 0.000016 | 
| Creating tmp table    | 0.000052 | 
| executing      | 0.000009 | 
| Copying to tmp table   | 0.000114 | 
| Sending data     | 0.000028 | 

तो मुझे लगता है कि क्या MySQL करते हैं जब "आदेश अशक्त द्वारा" जोड़ा, यह filesort एल्गोरिथ्म का उपयोग नहीं करता: मैं रूपरेखा का उपयोग देखने के लिए क्या mysql पृष्ठभूमि पर करते हैं, और केवल परिणाम की तरह देखने की कोशिश , हो सकता है कि जब यह tmp तालिका बनाता है, तो यह इंडेक्स का भी उपयोग करता है, और फिर पूरा होने पर समूह को ऑपरेशन द्वारा करने के लिए इंडेक्स का उपयोग करता है, यह केवल तालिका पंक्तियों से परिणाम पढ़ता है और परिणाम को सॉर्ट नहीं करता है।

लेकिन मेरी मूल राय यह है कि MySQL आइटम को सॉर्ट करने के लिए क्विकॉर्ट का उपयोग कर सकता है और उसके बाद समूह कर सकता है, इसलिए परिणाम भी क्रमबद्ध किया जाएगा।

किसी भी राय की सराहना की, धन्यवाद।

उत्तर

-1

समूह द्वारा कुछ कॉलम द्वारा रिकॉर्डिंग समूह है। उदाहरण के लिए आपके पास कॉलम "क्लास" है और आप इस कॉलम द्वारा समूह कर सकते हैं ताकि आपको इस कॉलम मानों के आधार पर समूहित रिकॉर्ड्स मिल जाए।

1
mysql> select max(post_date),post_author from wp_posts 
-> where id > 10 and id < 1000 
-> group by post_author; 
+———————+————-+ 
| max(post_date) | post_author | 
+———————+————-+ 
| 2009-07-03 12:58:39 | 1 | 
+———————+————-+ 
1 row in set (0.01 sec) 

mysql> show profiles; 
+———-+————+————————+ 
| Query_ID | Duration | Query | 
+———-+————+————————+ 
| 1 | 0.00013200 | SELECT DATABASE() | 
| 2 | 0.00030900 | show databases | 
| 3 | 0.00030400 | show tables | 
| 4 | 0.01180000 | select max(post_date),post_author from wp_posts where id > 10 and id < 1000 group by post_author |4 rows in set (0.00 sec) 

mysql> show profile cpu,block io for query 4; 
+———————-+———-+———-+————+————–+—————+ 
| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | 
+———————-+———-+———-+————+————–+—————+ 
| starting | 0.000085 | 0.000000 | 0.000000 | 0 | 0 | 
| Opening tables | 0.000010 | 0.000000 | 0.000000 | 0 | 0 | 
| System lock | 0.000005 | 0.000000 | 0.000000 | 0 | 0 | 
| Table lock | 0.000008 | 0.000000 | 0.000000 | 0 | 0 | 
| init | 0.000029 | 0.000000 | 0.000000 | 0 | 0 | 
| optimizing | 0.000014 | 0.000000 | 0.000000 | 0 | 0 | 
| statistics | 0.000062 | 0.000000 | 0.000000 | 0 | 0 | 
| preparing | 0.000016 | 0.000000 | 0.000000 | 0 | 0 | 
| Creating tmp table | 0.000035 | 0.000000 | 0.000000 | 0 | 0 | 
| executing | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 
| Copying to tmp table | 0.011386 | 0.004999 | 0.006999 | 0 | 0 | 
| Sorting result | 0.000044 | 0.000000 | 0.000000 | 0 | 0 | 
| Sending data | 0.000036 | 0.000000 | 0.000000 | 0 | 0 | 
| end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 
| removing tmp table | 0.000012 | 0.000000 | 0.000000 | 0 | 0 | 
| end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 
| end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 
| query end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 
| freeing items | 0.000013 | 0.000000 | 0.000000 | 0 | 0 | 
| closing tables | 0.000018 | 0.000000 | 0.000000 | 0 | 0 | 
| logging slow query | 0.000003 | 0.000000 | 0.000000 | 0 | 0 | 
| cleaning up | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 
+———————-+———-+———-+————+————–+—————+ 
22 rows in set (0.00 sec) 

mysql> 
mysql> 
mysql> select max(post_date),post_author from wp_posts 
-> where id > 10 and id < 1000 
-> group by post_author order by null; 
+———————+————-+ 
| max(post_date) | post_author | 
+———————+————-+ 
| 2009-07-03 12:58:39 | 1 | 
+———————+————-+ 
1 row in set (0.01 sec) 

mysql> show profiles; 
+———-+————+—————–+ 
| Query_ID | Duration | Query 
+———-+————+—————–+ 
|1 | 0.00013200 | SELECT DATABASE() 
|2 | 0.00030900 | show databases 
|3 | 0.00030400 | show tables 
|4 | 0.01180000 | select max(post_date),post_author from wp_posts where id > 10 and id < 1000 group by post_author 
|5 | 0.01177700 | select max(post_date),post_author from wp_posts where id > 10 and id < 1000 group by post_author order by null 
5 rows in set (0.00 sec) 
mysql> show profile cpu,block io for query 5; 
+———————-+———-+———-+————+————–+—————+ 
| Status | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | 
+———————-+———-+———-+————+————–+—————+ 
| starting | 0.000097 | 0.000000 | 0.000000 | 0 | 0 | 
| Opening tables | 0.000013 | 0.000000 | 0.000000 | 0 | 0 | 
| System lock | 0.000006 | 0.000000 | 0.000000 | 0 | 0 | 
| Table lock | 0.000008 | 0.000000 | 0.000000 | 0 | 0 | 
| init | 0.000032 | 0.000000 | 0.000000 | 0 | 0 | 
| optimizing | 0.000012 | 0.000000 | 0.000000 | 0 | 0 | 
| statistics | 0.000065 | 0.000000 | 0.000000 | 0 | 0 | 
| preparing | 0.000017 | 0.000000 | 0.000000 | 0 | 0 | 
| Creating tmp table | 0.000040 | 0.000000 | 0.000000 | 0 | 0 | 
| executing | 0.000003 | 0.000000 | 0.000000 | 0 | 0 | 
| Copying to tmp table | 0.011369 | 0.005999 | 0.004999 | 0 | 0 | 
| Sending data | 0.000040 | 0.000000 | 0.000000 | 0 | 0 | 
| end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 
| removing tmp table | 0.000031 | 0.000000 | 0.000000 | 0 | 0 | 
| end | 0.000005 | 0.000000 | 0.000000 | 0 | 0 | 
| end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 
| query end | 0.000004 | 0.000000 | 0.000000 | 0 | 0 | 
| freeing items | 0.000012 | 0.000000 | 0.000000 | 0 | 0 | 
| closing tables | 0.000009 | 0.000000 | 0.000000 | 0 | 0 | 
| logging slow query | 0.000003 | 0.000000 | 0.000000 | 0 | 0 | 
| cleaning up | 0.000003 | 0.000000 | 0.000000 | 0 | 0 | 
+———————-+———-+———-+————+————–+—————+ 
21 rows in set (0.00 sec) 

यहाँ से हम देख सकते हैं कि दूसरे भाग शामिल नहीं है "परिणाम छंटाई" कदम है, तो प्रदर्शन पर एक छोटे से प्रभाव पड़ता है।

+0

अच्छी तरह से, मैंने इसका उल्लेख ऊपर किया है। जो मैं वास्तव में जानना चाहता हूं वह है कि mysql "समूह द्वारा" कार्रवाई करने के लिए क्या करता है। – user188916

1

ग्रुप बाय क्लॉज एक रोल रोलअप संशोधक की अनुमति देता है जो सारांश पंक्ति में अतिरिक्त पंक्तियों को जोड़ने का कारण बनता है। ये पंक्तियां उच्च-स्तरीय (या सुपर-समेकित) सारांश संचालन का प्रतिनिधित्व करती हैं। इस प्रकार रोलअप आपको एक प्रश्न के साथ विश्लेषण के कई स्तरों पर सवालों के जवाब देने की अनुमति देता है। इसका उपयोग ओलाप (ऑनलाइन विश्लेषणात्मक प्रसंस्करण) संचालन के लिए समर्थन प्रदान करने के लिए किया जा सकता है।

मान लीजिए कि एक मेज नामित बिक्री साल, देश, उत्पाद, और लाभ रिकॉर्डिंग बिक्री लाभ के लिए स्तंभ हैं:

CREATE TABLE बिक्री ( साल INT नहीं NULL, देश VARCHAR (20) नहीं NULL, उत्पाद VARCHAR (32) न्यूल, लाभ INT );

तालिका की सामग्री भी इस तरह से एक सरल ग्रुप के साथ प्रति वर्ष संक्षेप किया जा सकता है:

mysql> का चयन करें साल, SUM (लाभ) से बिक्री ग्रुप साल तक; + ------ + ------------- + | वर्ष | एसयूएम (लाभ) | + ------ + ------------- + | 2000 | 4525 | | 2001 | 3010 | + ------ + ------------- +

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

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

mysql> चयन वर्ष, एसयूएम (लाभ) सालाना बिक्री के साथ रोलअप के साथ; + ------ + ------------- + | वर्ष | एसयूएम (लाभ) | + ------ + ------------- + | 2000 | 4525 | | 2001 | 3010 | | नल | 7535 | + ------ + ------------- +

ग्रैंड कुल सुपर-समेकित लाइन वर्ष कॉलम में मूल्य NULL द्वारा पहचाना जाता है।

रोलअप के पास कई समूह प्रभाव होने पर अधिक जटिल प्रभाव पड़ता है। इस मामले में, प्रत्येक बार अंतिम समूह कॉलम में "ब्रेक" (मान में परिवर्तन) होता है, क्वेरी एक अतिरिक्त सुपर-समेकित सारांश पंक्ति उत्पन्न करती है।

उदाहरण के लिए, रोलअप के बिना, पर साल, देश और उत्पाद आधारित बिक्री की मेज पर एक सारांश इस प्रकार दिखाई देंगे:

mysql> का चयन करें साल, देश, उत्पाद, SUM (लाभ) - से> बिक्री -> वर्ष, देश, उत्पाद द्वारा ग्रुप; + ------ + --------- + ------------ + ------------- + | वर्ष | देश | उत्पाद | एसयूएम (लाभ) | + ------ + --------- + ------------ + ------------- + | 2000 | फिनलैंड | कंप्यूटर | 1500 | | 2000 | फिनलैंड | फ़ोन | 100 | | 2000 | भारत | कैलकुलेटर | 150 | | 2000 | भारत | कंप्यूटर | 1200 | | 2000 | यूएसए | कैलकुलेटर | 75 | | 2000 | यूएसए | कंप्यूटर | 1500 | | 2001 | फिनलैंड | फ़ोन | 10 | | 2001 | यूएसए | कैलकुलेटर | 50 | | 2001 | यूएसए | कंप्यूटर | 2700 | | 2001 | यूएसए | टीवी | 250 | + ------ + --------- + ------------ + ------------- +

आउटपुट केवल वर्ष/देश/विश्लेषण के उत्पाद स्तर पर सारांश मान इंगित करता है।जब रोलअप जोड़ा जाता है, क्वेरी कई अतिरिक्त पंक्तियों का उत्पादन:

mysql> का चयन करें साल, देश, उत्पाद, SUM (लाभ) -> से बिक्री -> साल द्वारा समूह, देश, रोलअप के साथ उत्पाद; + ------ + --------- + ------------ + ------------- + | वर्ष | देश | उत्पाद | एसयूएम (लाभ) | + ------ + --------- + ------------ + ------------- + | 2000 | फिनलैंड | कंप्यूटर | 1500 | | 2000 | फिनलैंड | फ़ोन | 100 | | 2000 | फिनलैंड | नल | 1600 | | 2000 | भारत | कैलकुलेटर | 150 | | 2000 | भारत | कंप्यूटर | 1200 | | 2000 | भारत | नल | 1350 | | 2000 | यूएसए | कैलकुलेटर | 75 | | 2000 | यूएसए | कंप्यूटर | 1500 | | 2000 | यूएसए | नल | 1575 | | 2000 | नल | नल | 4525 | | 2001 | फिनलैंड | फ़ोन | 10 | | 2001 | फिनलैंड | नल | 10 | | 2001 | यूएसए | कैलकुलेटर | 50 | | 2001 | यूएसए | कंप्यूटर | 2700 | | 2001 | यूएसए | टीवी | 250 | | 2001 | यूएसए | नल | 3000 | | 2001 | नल | नल | 3010 | | नल | नल | नल | 7535 | + ------ + --------- + ------------ + ------------- +

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

* 

    Following each set of product rows for a given year and country, an extra summary row is produced showing the total for all products. These rows have the product column set to NULL. 
* 

    Following each set of rows for a given year, an extra summary row is produced showing the total for all countries and products. These rows have the country and products columns set to NULL. 
* 

    Finally, following all other rows, an extra summary row is produced showing the grand total for all years, countries, and products. This row has the year, country, and products columns set to NULL. 

अन्य विचार नीचे कुछ रोलअप की MySQL कार्यान्वयन के लिए विशिष्ट व्यवहार की सूची: यहाँ कैसे रोलअप आउटपुट की व्याख्या करने के लिए है

आप रोलअप उपयोग करते हैं, आप नहीं कर सकते परिणाम क्रमबद्ध करने के लिए खंड द्वारा ORDER का भी उपयोग करें। दूसरे शब्दों में, रोलअप और ऑर्डर बी पारस्परिक रूप से अनन्य हैं। हालांकि, आपके पास सॉर्ट ऑर्डर पर अभी भी कुछ नियंत्रण है। MySQL प्रकार परिणामों में ग्रुप द्वारा, और आप अलग-अलग स्तंभों के लिए सॉर्ट क्रम निर्दिष्ट करने के लिए सूची के आधार पर समूहित में नाम कॉलम के साथ स्पष्ट एएससी और DESC खोजशब्दों का उपयोग कर सकते हैं। (ROLLUP द्वारा जोड़े गए उच्च-स्तरीय सारांश पंक्तियां क्रमशः क्रमबद्ध क्रम के बावजूद पंक्तियों के बाद दिखाई देती हैं।)

LIMIT का उपयोग क्लाइंट को लौटाई गई पंक्तियों की संख्या को प्रतिबंधित करने के लिए किया जा सकता है। ROLLUP के बाद LIMIT लागू किया गया है, इसलिए सीमा ROLLUP द्वारा जोड़े गए अतिरिक्त पंक्तियों के विरुद्ध लागू होती है। उदाहरण के लिए:

mysql> का चयन करें साल, देश, उत्पाद, SUM (लाभ) -> से बिक्री -> साल द्वारा समूह, देश, रोलअप के साथ उत्पाद -> सीमा 5; + ------ + --------- + ------------ + ------------- + | वर्ष | देश | उत्पाद | एसयूएम (लाभ) | + ------ + --------- + ------------ + ------------- + | 2000 | फिनलैंड | कंप्यूटर | 1500 | | 2000 | फिनलैंड | फ़ोन | 100 | | 2000 | फिनलैंड | नल | 1600 | | 2000 | भारत | कैलकुलेटर | 150 | | 2000 | भारत | कंप्यूटर | 1200 | + ------ + --------- + ------------ + ------------- +

रोलअप के साथ LIMIT का उपयोग करने से परिणाम उत्पन्न हो सकते हैं जो व्याख्या करना अधिक कठिन हैं, क्योंकि आपके पास सुपर-समेकित पंक्तियों को समझने के लिए कम संदर्भ है।

प्रत्येक सुपर-समग्र पंक्ति में नल संकेतक तब उत्पादित होते हैं जब पंक्ति ग्राहक को भेजी जाती है। सर्वर मूल्य को बदलकर बाईं ओर दिए गए ग्रुप बाय क्लॉज में नामित कॉलम देखता है। परिणाम में किसी भी कॉलम के लिए नाम के साथ सेट किया गया है जो कि किसी भी नाम के लिए एक व्याख्यात्मक मिलान है, इसका मान पूर्ण पर सेट है। (यदि आप कॉलम नंबर द्वारा समूह कॉलम निर्दिष्ट करते हैं, तो सर्वर पहचानता है कि कौन से कॉलम संख्या से NULL पर सेट हैं।)

क्योंकि सुपर-समेकित पंक्तियों में नल मान क्वेरी में इतने देर चरण पर सेट किए गए परिणाम में सेट किए गए हैं प्रसंस्करण, आप स्वयं क्वेरी के भीतर नल मान के रूप में परीक्षण नहीं कर सकते हैं। उदाहरण के लिए, आप सुपर-कुल पंक्तियों के आउटपुट से समाप्त करने के लिए क्वेरी में हैविंग उत्पाद IS NULL जोड़ नहीं सकते हैं।

दूसरी तरफ, नल मान क्लाइंट पक्ष पर न्यूल के रूप में दिखाई देते हैं और किसी भी MySQL क्लाइंट प्रोग्रामिंग इंटरफ़ेस का उपयोग करके परीक्षण किया जा सकता है।

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