2011-03-08 55 views
28

什麼是ORDER BY NULL在MySQL中?MySQL中的ORDER BY NULL

它是否會降低查詢速度?

+0

如果您有任何疑問例如張貼 – 2011-03-08 11:38:33

+1

如果你不想被任何東西訂購只是by子句省略順序完全 – cusimar9 2011-03-08 11:39:02

回答

37

它的性能;在GROUP BY子句之後添加ORDER BY NULL將使您的查詢更快。

的解釋,從manual

默認情況下,MySQL的,如果你在查詢中指定ORDER BY col1, col2, ...以及排序的所有GROUP 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輸出的相關部分成功優化慢速查詢。

-1

有些開發人員使用ORDER BY NULL來提高使用GROUP BY子句的查詢速度。

原因是,在MySQL 5.6之前,在調用GROUP BY子句時存在隱式的數據類型。因此,添加ORDER BY NULL會禁用此隱式排序,從而使查詢運行得更快。

由於MySQL的5.6中,GROUP BY子句隱式排序DEPRECATED http://www.tocker.ca/2013/10/21/heads-up-implicit-sorting-by-group-by-is-deprecated-in-mysql-5-6.html

因此ORDER BY NULL技術現在是無用的。

+0

【官方文檔( http://dev.mysql.com/doc/refman/5.6/en/order-by-optimization.html)也表示:「** Note **依賴於MySQL 5.6中的隱式」GROUP BY「排序已被棄用。」 – Pang 2014-09-09 07:39:54

+3

-1;這個答案是錯誤的。 *依賴隱式排序已被棄用,但它仍然是MySQL的一部分,因此ORDER BY NULL仍然有用。你鏈接到的文章甚至說*沒有任何變化*。 – 2014-09-25 15:56:01

-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對所有GROUP BY col1,col2,...查詢進行排序,就像您在查詢中指定ORDER BY col1,col2 ...一樣。如果你包含一個包含相同列列表的明確的ORDER BY子句,MySQL會優化它,而不會有任何速度損失,儘管排序仍然存在。如果查詢包含GROUP BY,但您希望避免排序結果的開銷,則可以通過指定ORDER BY NULL來禁止排序。 http://dev.mysql.com/doc/refman/5.0/zh/order-by-optimization.html – Mahoor13 2014-11-09 06:34:28