黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 MySQL中distinct和group by性能比較

MySQL中distinct和group by性能比較

更新時間:2021-02-12 14:00:00 來源:動力節點 瀏覽5188次

MySQL是目前最流行的關系型數據庫之一,而關系數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度并提高了靈活性。我們知道在MySQL數據庫中DISTINCT可以去掉重復數據,而GROUP BY在分組后也會去掉重復數據,那這兩個關鍵字在去掉重復數據時的效率,究竟誰會更高一點?本文我們就來比較一些distinct和group by的性能。

一、測試過程:

準備一張測試表   

??CREATE TABLE `test_test` (
?????`id` int(11) NOT NULL auto_increment,
??????`num` int(11) NOT NULL default '0',
??????PRIMARY KEY ?(`id`)
?????) ENGINE=MyISAM ?DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

建個儲存過程向表中插入10W條數據  

???create procedure p_test(pa int(11))
?????begin
??????declare max_num int(11) default 100000;
??????declare i int default 0;
?????declare rand_num int;
??????select count(id) into max_num from test_test;
?????while i < pa do
??????????????if max_num < 100000 then
??????????????????????select cast(rand()*100 as unsigned) into rand_num;
??????????????????????insert into test_test(num)values(rand_num);
??????????????end if;
??????????????set i = i +1;
??????end while;
?????end

調用存儲過程插入數據

call p_test(100000);

開始測試:(不加索引)   

?select distinct num from test_test;
????select num from test_test group by num;
????[SQL] select distinct num from test_test;
????受影響的行: 0
????時間: 0.078ms
????[SQL] ?
???select num from test_test group by num;
???受影響的行: 0
????時間: 0.031ms

二、num字段上創建索引

ALTER TABLE `test_test` ADD INDEX `num_index` (`num`) ;

再次查詢   

select distinct num from test_test;
????select num from test_test group by num;
????[SQL] select distinct num from test_test;
???受影響的行: 0
????時間: 0.000ms
????[SQL] ?
????select num from test_test group by num;
????受影響的行: 0
????時間: 0.000ms

這時候我們發現時間太小了 0.000秒都無法精確了。

我們轉到命令行下 測試   

?mysql> set profiling=1;
????mysql> select distinct(num) from test_test;
????mysql> select num from test_test group by num;
????mysql> show profiles;
????+----------+------------+----------------------------------------+
????| Query_ID | Duration ??| Query ?????????????????????????????????|
????+----------+------------+----------------------------------------+
????| ???????1 | 0.00072550 | select distinct(num) from test_test ???|
????| ???????2 | 0.00071650 | select num from test_test group by num |
???+----------+------------+----------------------------------------+

?

加了索引之后 distinct 比沒加索引的 distinct 快了 107倍。

加了索引之后 group by 比沒加索引的 group by 快了 43倍。

再來對比 :distinct  和 group by

不管是加不加索引 group by 都比 distinct 快。因此使用的時候建議選 group by。

默認情況下,distinct會被hive翻譯成一個全局唯一reduce任務來做去重操作,因而并行度為1。而group by則會被hive翻譯成分組聚合運算,會有多個reduce任務并行處理,每個reduce對收到的一部分數據組,進行每組聚合(去重)

通過上述兩個實驗,我們可以得出這樣一條結論:在重復量比較高的表中,使用DISTINCT可以有效提高查詢效率,而在重復量比較低的表中,使用DISTINCT會嚴重降低查詢效率。所以并不是所有的DISTINCT都是降低效率的,當然你得提前判斷數據的重復量。想要獲取更多的MySQL知識,請到本站的MySQL教程觀看最新的MySQL學習資料,開啟全新的MySQL學習之旅。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 日韩欧美在线综合网高清 | 波多野结衣免费一区二区三区香蕉 | 午夜在线观看视频在线播放版 | 日韩美女va在线毛片免费知 | 午夜激情网站 | 国产成人高清亚洲一区91 | 欧美区在线观看 | 好吊色青青青国产在线播放 | 午夜免费福利片 | 欧美一卡二卡科技有限公司 | 五月婷婷在线视频观看 | 日韩欧美在线看 | 国产99热99 | 国产一卡二卡≡卡四卡无人 | 综合自拍亚洲综合图区美腿丝袜 | 欧美日韩亚洲二区在线 | 欧美成人精品第一区首页 | 国产成人精品综合久久久软件 | 午夜精品亚洲 | 国产无套在线观看视频 | 午夜插插 | 黄色片日韩 | 久草免费色站 | 国产一区二区在线观看动漫 | vk挠痒痒 | 91看片淫黄大片.在线天堂 | 国产视频黄色 | 韩国在线观看免费观看影院 | 成 人 a v黄 色 | 青青青国产依人精品视频 | 国产高清不卡视频 | 久草视屏| 美女黄频a美女大全免费皮 美女黄免费网站 | 午夜夜伦鲁鲁片 | 猛h辣h高h文湿重口 美日毛片 | 免看黄| 国产99re| 天堂中文在线免费观看 | 国产一区二区影院 | 国产一在线 | 日日操操操 |