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