ORDER BY NULL в MySQL
Что такое ORDER BY NULL
в MySQL?
Уменьшает ли скорость запроса?
Ответы
Ответ 1
Это для производительности; добавив 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
.
Ответ 2
Эта ссылка
http://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html
Говорит, что это ускоряет запросы, которые используют GROUP BY:
Если запрос включает GROUP BY, но вы хотите избежать накладных расходов на сортировку результата, вы можете запретить сортировку, указав ORDER BY NULL.
Ответ 3
Некоторые разработчики использовали 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
Я созерцаю, но вижу производительность:
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)