ЗАКАЗАТЬ НА НУЛЕ в MySQL - PullRequest
33 голосов
/ 08 марта 2011

Что такое ORDER BY NULL в MySQL?

Уменьшает ли это скорость запроса?

Ответы [ 4 ]

43 голосов
/ 08 марта 2011

Это для производительности; добавление ORDER BY NULL после предложения GROUP BY сделает ваш запрос быстрее.

Объяснение из руководства :

По умолчанию 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;

В этой статье описывается автор, успешно оптимизирующий медленный запрос с помощью этого трюка, а также соответствующие части вывода EXPLAIN.

10 голосов
/ 08 марта 2011

Эта ссылка

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

Говорит, что ускоряет запросы, использующие GROUP BY:

Если запрос включает GROUP BY, но вы хотите избежать издержек при сортировке результата, вы можете отменить сортировку, указав ORDER BY NULL.

0 голосов
/ 06 ноября 2014

Я соори, но я вижу исполнение:

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)
0 голосов
/ 30 июня 2014

Некоторые разработчики использовали ORDER BY NULL для увеличения скорости запросов с помощью предложения GROUP BY.

Причина в том, что до MySQL 5.6 при вызове предложения GROUP BY была неявная сортировка данных. Поэтому добавление ORDER BY NULL инактивировало эту неявную сортировку и, следовательно, ускорило выполнение запроса.

Начиная с 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

Поэтому метод ORDER BY NULL теперь бесполезен.

...