programing

MySQL에서 NULL을 기준으로 주문

muds 2023. 8. 29. 21:00
반응형

MySQL에서 NULL을 기준으로 주문

란?ORDER BY NULLMySQL?

그러면 쿼리 속도가 느려집니까?

성능 향상을 위한 것입니다.ORDER BY NULL▁a▁after시.GROUP BY절을 사용하면 쿼리 속도가 빨라집니다.

설명서의 설명:

은 모든 MySQL을 합니다.GROUP BY col1, col2, ...한 .ORDER BY col1, col2, ...조회에서도 마찬가지입니다.으로 명적으포경우를 .ORDER BY동일한 열 목록을 포함하는 절인 MySQL은 정렬이 계속 발생하더라도 속도 저하 없이 최적화합니다.쿼리에 다음이 포함된 경우GROUP BY데 오버헤드를 는 그나결과정는데드피오를하드위버기다해다같음있이니습지수억정제정렬할여을러하과는헤를렬하ifying▁by▁but▁sorting▁spec,를 지정하여 정렬을 억제할 수 있습니다.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을 지정하여 정렬을 억제할 수 있습니다.

Mysql 8.0 ORDER BY NULL은 쿼리 성능을 향상시키지 않기 때문입니다.

https://dev.mysql.com/doc/refman/8.0/en/order-by-optimization.html

이전 버전(MySQL 5.7 이하)에서는 특정 조건에서 암묵적으로 정렬되었습니다.MySQL 8.0에서는 더 이상 이 작업이 수행되지 않으므로 암시적 정렬을 억제하기 위해 끝에 ORDER BY NULL을 지정할 필요가 없습니다(이전에 수행한 것처럼).그러나 쿼리 결과는 이전 MySQL 버전과 다를 수 있습니다.지정된 정렬 순서를 생성하려면 ORDER BY 절을 제공합니다.

일부 개발자는 GROUP BY 절을 사용하여 쿼리 속도를 높이기 위해 ORDER BY NULL을 사용했습니다.

그 이유는 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)

언급URL : https://stackoverflow.com/questions/5231907/order-by-null-in-mysql

반응형