MySQL

2011-03-08 4 views
28

में NULL द्वारा आदेश MySQL में ORDER BY NULL क्या है?MySQL

क्या यह क्वेरी की गति को कम करता है?

+0

किसी भी प्रश्न उदाहरण पोस्ट अगर आप –

+1

आप कुछ भी द्वारा आदेश सिर्फ खंड द्वारा कुल मिलाकर – cusimar9

उत्तर

37

यह प्रदर्शन के लिए है; ORDER BY NULLGROUP BY क्लॉज जोड़ने के बाद आपकी क्वेरी तेज हो जाएगी।

एक व्याख्या, manual से:

डिफ़ॉल्ट रूप से, MySQL सभी GROUP BY col1, col2, ... प्रश्नों सॉर्ट करता है जैसे आप क्वेरी में ORDER BY col1, col2, ... निर्दिष्ट रूप में अच्छी तरह। यदि आप एक स्पष्ट ORDER BY खंड शामिल करते हैं जिसमें एक ही कॉलम सूची होती है, तो MySQL बिना किसी गति दंड के इसे अनुकूलित करता है, हालांकि सॉर्टिंग अभी भी होती है। यदि किसी क्वेरी में GROUP BY शामिल है लेकिन आप परिणाम को सॉर्ट करने के ओवरहेड से बचना चाहते हैं, तो आप ORDER BY NULL निर्दिष्ट करके सॉर्टिंग को दबा सकते हैं। उदाहरण के लिए:

INSERT INTO foo 
SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL; 

This article लेखक सफलतापूर्वक इस चाल, EXPLAIN उत्पादन के प्रासंगिक भागों के साथ पूरा का दुरुपयोग करके एक धीमी गति से क्वेरी अनुकूलन के वर्णन करता है।

9

यह लिंक

http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html

यह प्रश्नों कि द्वारा समूह का उपयोग को गति कहते हैं

एक प्रश्न ग्रुप द्वारा भी शामिल है, लेकिन आपको परिणाम छँटाई की भूमि के ऊपर से बचना चाहते हैं, तो आप नल द्वारा ऑर्डर निर्दिष्ट करके सॉर्टिंग दबा सकते हैं।

-1

कुछ डेवलपर्स ग्रुप बाय क्लॉज का उपयोग करके प्रश्नों की गति को बढ़ाने के लिए न्यूल द्वारा ऑर्डर करते थे।

कारण यह है कि MySQL 5.6 से पहले ग्रुप बाय क्लॉज को कॉल करते समय डेटा का एक अंतर्निहित प्रकार था। इसलिए एनयूएलएल द्वारा ऑर्डर जोड़ना इस अंतर्निहित प्रकार को निष्क्रिय कर रहा था और इसके परिणामस्वरूप क्वेरी को तेजी से चलाया जा रहा था।

MySQL 5.6 के बाद से, GROUP BY क्लॉज़ के निहित छंटाई http://www.tocker.ca/2013/10/21/heads-up-implicit-sorting-by-group-by-is-deprecated-in-mysql-5-6.html

हटाया गया है इसलिए द्वारा शून्य तकनीक आदेश अब बेकार है।

+0

[आधिकारिक दस्तावेज़] आदेश छोड़ नहीं करना चाहते हैं (http://dev.mysql.com/doc/refman/5.6/en/order-by-optimization.html) यह भी कहता है: "** नोट ** MySQL 5.6 में अंतर्निहित 'ग्रुप बाय' सॉर्टिंग पर निर्भरता को हटा दिया गया है।" – Pang

+3

-1; यह जवाब गलत है। * निहित सॉर्टिंग पर * निर्भर * को हटा दिया गया है, लेकिन यह अभी भी MySQL का हिस्सा है और इसलिए न्यूल द्वारा ऑर्डर अभी भी एक उद्देश्य प्रदान करता है। आप जिस लेख से लिंक करते हैं वह यह भी कहता है कि * अभी तक कुछ भी नहीं बदला है *। –

-2

मैं soory हूँ, लेकिन मैं कार्यक्षमता देख सकते हैं:

mysql> SELECT *,COUNT(status) FROM big_table GROUP BY status; 
+----------------+----------------------------------+--------+---------------+ 
| id    | hash        | status | COUNT(status) | 
+----------------+----------------------------------+--------+---------------+ 
| 14149924276950 | 20e2873f1026c867a1044681895130b8 |  0 |  268044 | 
| 14149924273884 | 889dc604799c563783396a3cb2c688a5 |  1 |  277474 | 
| 1414992427397 | 4e1769e2e64e737f37b918b834f8f696 |  2 |  279815 | 
| 14149924277490 | 539b71f083fc95a93d0d4b904a56ebb2 |  3 |  290216 | 
| 14149924274097 | ec694b8fc1786ea4f612dbe55d351715 |  4 |  272748 | 
| 14149924272735 | 64c3d1077c3ed3ee02398896376327aa |  5 |  280785 | 
| 14149924278670 | 05c143790ba4ecf73fc3be78d095c067 |  6 |  295417 | 
| 14149924271189 | 79bcafe38074703a49fb372c95e3676a |  7 |  310937 | 
| 14149924273279 | 29069b0fe511c160e95f98e2e2b770ac |  8 |  279338 | 
| 14149924277367 | 2e72091679aa6e3d64ed3c407ceeb6d4 |  9 |  281226 | 
+----------------+----------------------------------+--------+---------------+ 
10 rows in set (44.43 sec) 

mysql> SELECT *,COUNT(status) FROM big_table GROUP BY status ORDER BY NULL; 
+----------------+----------------------------------+--------+---------------+ 
| id    | hash        | status | COUNT(status) | 
+----------------+----------------------------------+--------+---------------+ 
| 14149924272735 | 64c3d1077c3ed3ee02398896376327aa |  5 |  280785 | 
| 14149924277367 | 2e72091679aa6e3d64ed3c407ceeb6d4 |  9 |  281226 | 
| 1414992427397 | 4e1769e2e64e737f37b918b834f8f696 |  2 |  279815 | 
| 14149924278670 | 05c143790ba4ecf73fc3be78d095c067 |  6 |  295417 | 
| 14149924274097 | ec694b8fc1786ea4f612dbe55d351715 |  4 |  272748 | 
| 14149924271189 | 79bcafe38074703a49fb372c95e3676a |  7 |  310937 | 
| 14149924276950 | 20e2873f1026c867a1044681895130b8 |  0 |  268044 | 
| 14149924273279 | 29069b0fe511c160e95f98e2e2b770ac |  8 |  279338 | 
| 14149924277490 | 539b71f083fc95a93d0d4b904a56ebb2 |  3 |  290216 | 
| 14149924273884 | 889dc604799c563783396a3cb2c688a5 |  1 |  277474 | 
+----------------+----------------------------------+--------+---------------+ 
10 rows in set (44.13 sec) 
+1

डिफ़ॉल्ट रूप से, MySQL सभी समूह को col1, col2, ... जैसा क्वेरी करता है जैसे कि आपने क्वेरी में col1, col2, ... द्वारा ऑर्डर निर्दिष्ट किया है। यदि आप एक स्पष्ट ऑर्डर द्वारा क्लॉज को शामिल करते हैं जिसमें एक ही कॉलम सूची होती है, तो MySQL बिना किसी गति दंड के इसे अनुकूलित करता है, हालांकि सॉर्टिंग अभी भी होती है।यदि किसी क्वेरी में ग्रुप BY शामिल है लेकिन आप परिणाम को सॉर्ट करने के ओवरहेड से बचना चाहते हैं, तो आप ऑर्डर द्वारा ऑर्डर करके सॉर्टिंग को दबा सकते हैं। http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – Mahoor13