Group by 和distinct對比

**  Group by 和distinct對比**

CREATE TABLE sbtest1 (
id int(11) NOT NULL AUTO_INCREMENT,
k int(11) NOT NULL DEFAULT '0',
c char(120) NOT NULL DEFAULT '',
pad char(60) NOT NULL DEFAULT '',
PRIMARY KEY (id),
KEY k_1 (k)
) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8;
1000w數據量

1、  對於主鍵

Group by的執行計劃
Group by 和distinct對比
Distinct的執行計劃
Group by 和distinct對比
可以看到group by使用了主鍵,而distinct使用了輔助索引k_1
這說明了distinct可能是一種統計操作,也就是Innodb在有輔助索引時候,統計會走輔助索引,如下圖,進行count(*)也是走的k_1輔助索引。
Group by 和distinct對比

2、  對於輔助索引

Group by的執行計劃
Group by 和distinct對比
Distinct的執行計劃
Group by 和distinct對比
通過以上對比,可以看出來他們是等價的,執行計劃一致。

3、  對於普通字段

Group by的執行計劃,這裏做了一個order by null的處理,就是不排序
Group by 和distinct對比
Distinct的執行計劃,按理說,如果distinct要是統計的話爲啥沒有走k_1
Group by 和distinct對比
通過以上對比,可以看出來也是等價的,執行計劃一致。

4、  Group by 需要聚合,而distinct不需要聚合

5、  Group by 比 distinct效率高,distinct需要讀取所有記錄,而group by只需要讀取分組的

數量的記錄。
set profiling=1;
select distinct(k) from sbtest1
select k from sbtest1 group by k
再通過show profiles查看
Group by 和distinct對比
Group by比distinct快了0.05秒多

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章