MySQL中的ORDER BY NULL
是什么?
是否会降低查询速度?
答案 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)