很多情況下,尤其是對文本類型的字段,直接使用count distinct的查詢效率非常低,而先做group by再count往往能提升查詢效率。
但是,實驗表明,對於不同的字段,count distinct與count group by的性能並不一樣,而且其效率與目標數據集的數據重複度相關。
舉例:分別使用count distinct 和 count group by對 bigint, macaddr, text三種類型的字段做查詢。
首先創建如下結構的表testmac
| Column | Type | Modifiers |
| mac_bigint | bigint | |
| mac_macaddr | macaddr | |
| mac_text | text | |
並插入1000W條記錄,並保證mac_bigint爲mac_macaddr去掉冒號後的16進制轉換而成的10進制bigint,而mac_text爲mac_macaddr的文本形式,從而保證在這三個字段上查詢的結果,也及複雜度相同。
count distinct SQL如下:
select
count(distinct mac_macaddr)
from
testmac
count group by SQL如下:select
count(*)
from
(select
mac_macaddr
from
testmac
group by
1) foo
對於不同記錄數較大的情景(1000萬條記錄中,有300多萬條不同記錄),查詢時間(單位毫秒)如下表所示。
| query/字段類型 | macaddr | bigint | text |
|------------------------------------------|
| count distinct | 24668.023 | 13890.051 | 149048.911 |
| count group by | 32152.808 | 25929.555 | 159212.700 |
對於不同記錄數較小的情景(1000萬條記錄中,只有1萬條不同記錄),查詢時間(單位毫秒)如下表所示。
| query/字段類型 | macaddr | bigint | text |
|------------------------------------------|
| count distinct | 20006.681 | 9984.763 | 225208.133 |
| count group by | 2529.420 | 2554.720 | 3701.869 |
從上面兩組實驗可看出:
在不同記錄數較小時,count group by性能普遍高於count distinct,尤其對於text類型表現的更明顯。
而不同記錄數較大時,count group by 的性能反而低於count distinct
摘自:https://www.jianshu.com/p/34800d06f63d
彩蛋:
坊間傳聞,在面對大數據量時“明令禁止使用distinct”,原因是成本太高,不明真相的吃瓜羣衆還是多練練group by吧~~~(微笑臉)