1. 程式人生 > >mysql中關於order by的一些小細節

mysql中關於order by的一些小細節

order by我們都知道是用於排序的

今天看到一些很奇妙的寫法

order by --id

order by null

以前沒見過這東西,老稀奇了。興致來了,就做個實驗研究一下

mysql> explain select * from test1 ;
+----+-------------+-------------+------+---------------+------+---------+------+------+-------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | test1 | ALL  | NULL          | NULL | NULL    | NULL | 5160 | NULL  |
+----+-------------+-------------+------+---------------+------+---------+------+------+-------+
1 row in set

裸奔的執行計劃,作為對比

mysql> explain select * from test1 order by null;

+----+-------------+-------------+------+---------------+------+---------+------+------+-------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | test1 | ALL  | NULL          | NULL | NULL    | NULL | 5160 | NULL  |
+----+-------------+-------------+------+---------------+------+---------+------+------+-------+
1 row in set
order by null的執行計劃,沒有什麼變化




mysql> explain select * from test1 order by --test1ID;
    -> 
    -> ;
+----+-------------+-------------+------+---------------+------+---------+------+------+----------------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows | Extra          |
+----+-------------+-------------+------+---------------+------+---------+------+------+----------------+
|  1 | SIMPLE      | test1 | ALL  | NULL          | NULL | NULL    | NULL | 5160 |Using filesort

|
+----+-------------+-------------+------+---------------+------+---------+------+------+----------------+
1 row in set
在使用--的時候竟然走了磁碟排序,從這裡受到了啟發。

實驗發現order by -id是按id倒序排序,--就是兩次倒序的正序排序,但是經過兩次是要走磁碟排序的。


-------------------------------------------------------------------------------------------------

那order by null是什麼意思呢,經高人指點,實際就是不排序的意思。應用的場合就是使用group by的場合

我們知道預設的group by是要進行排序的,這個可能會有很高的效能消耗,如果order by null可以規避掉,這自然是極好的。

mysql> explain select count(*) from test_profile group by kind;
+----+-------------+----------------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table          | type | possible_keys | key  | key_len | ref  | rows | Extra                           |
+----+-------------+----------------+------+---------------+------+---------+------+------+---------------------------------+
|  1 | SIMPLE      | test_profile | ALL  | NULL          | NULL | NULL    | NULL |  165 |Using temporary; Using filesort |
+----+-------------+----------------+------+---------------+------+---------+------+------+---------------------------------+
1 row in set
沒有使用order by null的場合,可見使用了臨時空間,也用了磁碟進行排序。


mysql> explain select count(*) from test_profile group by kind order by null;
+----+-------------+----------------+------+---------------+------+---------+------+------+-----------------+
| id | select_type | table          | type | possible_keys | key  | key_len | ref  | rows | Extra           |
+----+-------------+----------------+------+---------------+------+---------+------+------+-----------------+
|  1 | SIMPLE      | test_profile | ALL  | NULL          | NULL | NULL    | NULL |  165 | Using temporary |
+----+-------------+----------------+------+---------------+------+---------+------+------+-----------------+
1 row in set

使用order by null的場合,還是進行了排序!但是不再使用磁碟排序了!可見使用order by null可以規避掉部分的排序。

經過對比,order by null的資料的是無序,這兩條sql並不等價,但是在不需要排序的場合,完全可以用order by null規避掉group by中的排序!