使用Order By NULL 解決 group by后自動排序,優化Sql性能
對於 Group by
后的結果,Mysql搜索引擎會將結果按照Group by
的字段按照升序,自動排序,例如:
test表數據:
執行如下語句:
SELECT item_no,item_name FROM test GROUP BY item_no,item_name
結果如下圖所示,
很明顯,結果對原表進行了排序,但是我們本身是沒有加order by
語句的,所以可以得出,group by
語句將會對結果進行排序,如上語句,相當於如下sql:
SELECT item_no,item_name FROM test GROUP BY item_no,item_name ORDER BY item_no,item_name
其執行結果如下:
優化
但是有時,當數據量非常龐大,並且group by
的字段又非索引字段,對於結果集,又沒有排序的需求,那么 此時的自動排序功能,將影響到sql的性能,所以我們需要使用 order by null
來解決,強制解除排序
使用explain關鍵字,對優化前后的語句進行解析,如下兩圖
優化前:
優化后
對於優化前,有一個非常消耗性能的操作,Using filesort
,文件排序
問題
group by 后排序的原因是因為需要保證每次從各個分組中獲取到的記錄保持一致(如果每個group by 后的分組有多條,則默認取第一條),所以如果去除排序,可能導致數據不一致,需權衡!!