MySQL中的ORDER BY NULL

时间:2011-03-08 11:36:17

标签: mysql sql-order-by

MySQL中的ORDER BY NULL是什么?

是否会降低查询速度?

5 个答案:

答案 0 :(得分:43)

这是为了表现;在ORDER BY NULL子句后添加GROUP 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输出的相关部分。

答案 1 :(得分:10)

此链接

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

说它加速了使用GROUP BY的查询:

  

如果查询包含GROUP BY但您希望避免对结果进行排序的开销,则可以通过指定ORDER BY NULL来禁止排序。

答案 2 :(得分:2)

由于Mysql 8.0 ORDER BY NULL不能提高查询性能。

https://dev.mysql.com/doc/refman/8.0/en/order-by-optimization.html

以前(MySQL 5.7及更低版本),GROUP BY隐式排序在 一定条件下。在MySQL 8.0中,这种情况不再发生,因此请指定 最后使用ORDER BY NULL抑制隐式排序(已完成) 之前)。但是,查询结果可能会有所不同 从以前的MySQL版本开始。要产生给定的排序顺序,请提供 一个ORDER BY子句。

答案 3 :(得分:-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技术现在没用了。

答案 4 :(得分:-2)

我很抱歉,但我可以看到表现:

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)