sql優化之count distinct vs. count group by

很多情況下,尤其是對文本類型的字段,直接使用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吧~~~(微笑臉)

發佈了25 篇原創文章 · 獲贊 23 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章