2011-03-08 18 views
28

¿Qué es ORDER BY NULL en MySQL?ORDER BY NULL en MySQL

¿Disminuye la velocidad de consulta?

+0

si cualquier consulta de ejemplo que lo ponga –

+1

Si no quiere pedir por nada basta con omitir la cláusula ORDER BY completo – cusimar9

Respuesta

37

Es por rendimiento; agregar ORDER BY NULL después de una cláusula GROUP BY hará que su consulta sea más rápida.

una explicación, desde el manual:

Por defecto, MySQL ordena todas GROUP BY col1, col2, ... consultas, si ha especificado ORDER BY col1, col2, ... en la consulta también. Si incluye una cláusula explícita ORDER BY que contiene la misma lista de columnas, MySQL la optimiza sin ninguna penalización de velocidad, aunque la clasificación todavía se produce. Si una consulta incluye GROUP BY pero desea evitar la sobrecarga de ordenar el resultado, puede suprimir la ordenación especificando ORDER BY NULL. Por ejemplo:

INSERT INTO foo 
SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL; 

This article describe el autor optimizar con éxito una consulta lenta mediante la explotación de este truco, completa con las partes pertinentes de la salida EXPLAIN.

-1

Algunos desarrolladores usaron ORDER BY NULL para aumentar la velocidad de las consultas utilizando la cláusula GROUP BY.

La razón es que antes de MySQL 5.6 había un tipo implícito de los datos al llamar a la cláusula GROUP BY. Por lo tanto, agregar ORDER BY NULL desactivaba este tipo implícito y, en consecuencia, hacía que la consulta se ejecutara más rápido.

Desde MySQL 5.6, la clasificación implícita de la cláusula GROUP BY está en desuso http://www.tocker.ca/2013/10/21/heads-up-implicit-sorting-by-group-by-is-deprecated-in-mysql-5-6.html

Por lo tanto el ORDER BY técnica NULL es ahora inútil.

+0

[doc Oficial] (http://dev.mysql.com/doc/refman/5.6/en/order-by-optimization.html) también dice: "** Nota ** Confiar en la clasificación implícita de' GROUP BY' en MySQL 5.6 está en desuso. " – Pang

+3

-1; esta respuesta es incorrecta * Confiar * en la ordenación implícita está en desuso, pero todavía es parte de MySQL, por lo que ORDER BY NULL aún cumple una función. El mismo artículo con el que enlazas incluso dice que * nada ha cambiado aún *. –

-2

Soy soory pero que se puede ver del perfomance:

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) 
+1

Por defecto, MySQL ordena todas las consultas GROUP BY col1, col2, ... como si especificara ORDER BY col1, col2, ... en la consulta también. Si incluye una cláusula ORDER BY explícita que contiene la misma lista de columnas, MySQL la optimiza sin ninguna penalización de velocidad, aunque la clasificación todavía se produce.Si una consulta incluye GROUP BY pero desea evitar la sobrecarga de ordenar el resultado, puede suprimir la ordenación especificando ORDER BY NULL. http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html – Mahoor13