經實際測試,同等條件下,5千萬條數據,Distinct比Group by效率高,但是,這是有條件的,這五千萬條數據中不重復的僅僅有三十多萬條,這意味着,五千萬條中基本都是重復數據。
為了驗證,重復數據是否對其有影響,本人針對80萬條數據進行測試:
下面是對CustomerId去重,CustomerId的重復項及其多,80萬條中僅僅50條不重復的。可以看到,Distinct快一點。
用例1:
用例2:
下面是對Id去重,Id基本唯一,80萬條中沒有重復的。可以看到,Group By更快。
綜上所述,其他條件一定時,數據重復項越多,distinct效率越高,反之,數據越唯一,group by效率越高。(測試用例較少,時間差距其實不明顯,受電腦影響,數據有時不准。所以具體數據具體試驗,不要盲目使用,人雲亦雲。)
原因:
distinct需要將列中的全部內容都存儲在一個內存中,可以理解為一個hash結構,key為列的值,最后計算hash結構中有多少個key即可得到結果。
很明顯,需要將所有不同的值都存起來,因此重復數據越多,需要存儲的不同項也越少。但這種方式內存消耗可能較大,看你電腦。
而group by的方式是先將列排序。而數據庫中的group一般使用sort的方法,即數據庫會先對列進行排序。而排序的基本理論是,時間復雜為nlogn,空間為1.,然后只要單純的計數就可以了。優點是空間復雜度小,缺點是要進行一次排序,執行時間會較長。
兩中方法各有優劣,在使用的時候,我們需要根據實際情況進行取舍,不要一刀切。