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中的排序!