MySQL去重該使用distinct還是group by?
前言
關(guān)于group by 與distinct 性能對(duì)比:網(wǎng)上結(jié)論如下,不走索引少量數(shù)據(jù)distinct性能更好,大數(shù)據(jù)量group by 性能好,走索引group by性能好。走索引時(shí)分組種類少distinct快。關(guān)于網(wǎng)上的結(jié)論做一次驗(yàn)證。
準(zhǔn)備階段屏蔽查詢緩存
查看MySQL中是否設(shè)置了查詢緩存。為了不影響測(cè)試結(jié)果,需要關(guān)閉查詢緩存。
show variables like '%query_cache%';

查看是否開(kāi)啟查詢緩存決定于query_cache_type和query_cache_size。
- 方法一:關(guān)閉查詢緩存需要找到my.ini,修改
query_cache_type需要修改C:\ProgramData\MySQL\MySQL Server 5.7\my.ini配置文件,修改query_cache_type=0或2。 - 方法二:設(shè)置
query_cache_size為0,執(zhí)行以下語(yǔ)句。
set global query_cache_size = 0;
方法三:如果你不想關(guān)閉查詢緩存,也可以在使用RESET QUERY CACHE。
現(xiàn)在測(cè)試環(huán)境中query_cache_type=2代表按需進(jìn)行查詢緩存,默認(rèn)的查詢方式是不會(huì)進(jìn)行緩存,如需緩存則需要在查詢語(yǔ)句中加上sql_cache。
數(shù)據(jù)準(zhǔn)備
t0表存放10W少量種類少的數(shù)據(jù)
drop table if exists t0; create table t0( id bigint primary key auto_increment, a varchar(255) not null ) engine=InnoDB default charset=utf8mb4 collate=utf8mb4_bin; 1 2 3 4 5 drop procedure insert_t0_simple_category_data_sp; delimiter // create procedure insert_t0_simple_category_data_sp(IN num int) begin set @i = 0; while @i < num do insert into t0(a) value(truncate(@i/1000, 0)); set @i = @i + 1; end while; end // call insert_t0_simple_category_data_sp(100000);
t1表存放1W少量種類多的數(shù)據(jù)
drop table if exists t1; create table t1 like t0; 1 2 drop procedure insert_t1_complex_category_data_sp; delimiter // create procedure insert_t1_complex_category_data_sp(IN num int) begin set @i = 0; while @i < num do insert into t1(a) value(truncate(@i/10, 0)); set @i = @i + 1; end while; end // call insert_t1_complex_category_data_sp(10000);
t2表存放500W大量種類多的數(shù)據(jù)
drop table if exists t2; create table t2 like t1; 1 2 drop procedure insert_t2_complex_category_data_sp; delimiter // create procedure insert_t2_complex_category_data_sp(IN num int) begin set @i = 0; while @i < num do insert into t1(a) value(truncate(@i/10, 0)); set @i = @i + 1; end while; end // call insert_t2_complex_category_data_sp(5000000);
測(cè)試階段
驗(yàn)證少量種類少數(shù)據(jù)
未加索引
set profiling = 1; select distinct a from t0; show profiles; select a from t0 group by a; show profiles; alter table t0 add index `a_t0_index`(a);

由此可見(jiàn):少量種類少數(shù)據(jù)下,未加索引,distinct和group by性能相差無(wú)幾。
加索引
alter table t0 add index `a_t0_index`(a);
執(zhí)行上述類似查詢后

由此可見(jiàn):少量種類少數(shù)據(jù)下,加索引,distinct和group by性能相差無(wú)幾。
驗(yàn)證少量種類多數(shù)據(jù)未加索引
執(zhí)行上述類似未加索引查詢后

由此可見(jiàn):少量種類多數(shù)據(jù)下,未加索引,distinct比group by性能略高,差距并不大。
加索引
alter table t1 add index `a_t1_index`(a);
執(zhí)行類似未加索引查詢后

由此可見(jiàn):少量種類多數(shù)據(jù)下,加索引,distinct和group by性能相差無(wú)幾。
驗(yàn)證大量種類多數(shù)據(jù)
未加索引
SELECT count(1) FROM t2;

執(zhí)行上述類似未加索引查詢后

由此可見(jiàn):大量種類多數(shù)據(jù)下,未加索引,distinct比group by性能高。
加索引
alter table t2 add index `a_t2_index`(a);
執(zhí)行上述類似加索引查詢后

由此可見(jiàn):大量種類多數(shù)據(jù)下,加索引,distinct和group by性能相差無(wú)幾。
總結(jié)
去重場(chǎng)景下,未加索引時(shí),更偏向于使用distinct,而加索引時(shí),distinct和group by兩者都可以使用。
總結(jié)
到此這篇關(guān)于MySQL去重該使用distinct還是group by?的文章就介紹到這了,更多相關(guān)mysql 去重distinct group by內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL中數(shù)據(jù)去重的兩種方式詳解(DISTINCT和GROUP BY)
- 詳解MySQL中DISTINCT去重的核心注意事項(xiàng)
- mysql distinct去重,IFNULL空值處理方式
- MySQL中distinct和group by去重的區(qū)別解析
- MySQL中使用distinct單、多字段去重方法
- MySQL中distinct和group?by去重效率區(qū)別淺析
- MySQL去重中distinct和group?by的區(qū)別淺析
- MySQL中使用去重distinct方法的示例詳解
- Mysql中distinct與group by的去重方面的區(qū)別
- MySQL DISTINCT 去重的幾種方法使用
相關(guān)文章
MySQL實(shí)現(xiàn)批量插入測(cè)試數(shù)據(jù)的方式總結(jié)
在開(kāi)發(fā)過(guò)程中經(jīng)常需要一些測(cè)試數(shù)據(jù),?這個(gè)時(shí)候如果手敲的話,?十行二十行還好,?多了就很死亡了,?接下來(lái)介紹兩種常用的MySQL測(cè)試數(shù)據(jù)批量生成方式,希望對(duì)大家有所幫助2023-05-05
MySQL 數(shù)據(jù)庫(kù) ALTER命令講解
MySQL 為關(guān)系型數(shù)據(jù)庫(kù)(Relational Database Management System)。本文重點(diǎn)給大家介紹mysql數(shù)據(jù)庫(kù)alert命令講解,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05
MySQL MVVC多版本并發(fā)控制的實(shí)現(xiàn)詳解
在多版本并發(fā)控制中,為了保證數(shù)據(jù)操作在多線程過(guò)程中,保證事務(wù)隔離的機(jī)制,降低鎖競(jìng)爭(zhēng)的壓力,保證較高的并發(fā)量。在每開(kāi)啟一個(gè)事務(wù)時(shí),會(huì)生成一個(gè)事務(wù)的版本號(hào),被操作的數(shù)據(jù)會(huì)生成一條新的數(shù)據(jù)行2022-08-08
Mysql實(shí)現(xiàn)簡(jiǎn)易版搜索引擎的示例代碼
前段時(shí)間,因?yàn)轫?xiàng)目需求,需要根據(jù)關(guān)鍵詞搜索聊天記錄,所以本文實(shí)現(xiàn)了Mysql實(shí)現(xiàn)簡(jiǎn)易版搜索引擎,具有一定的參考價(jià)值,感興趣的可以了解一下2021-08-08
mysql實(shí)現(xiàn)查詢數(shù)據(jù)并根據(jù)條件更新到另一張表的方法示例
這篇文章主要介紹了mysql實(shí)現(xiàn)查詢數(shù)據(jù)并根據(jù)條件更新到另一張表的方法,結(jié)合實(shí)例形式分析了mysql多表關(guān)聯(lián)查詢、更新等相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
關(guān)于MySQL?B+樹(shù)索引與哈希索引詳解
索引是一種特殊的數(shù)據(jù)庫(kù)結(jié)構(gòu),被設(shè)計(jì)用來(lái)快速查詢數(shù)據(jù)庫(kù)表中的特定記錄,下面這篇文章主要給大家介紹了關(guān)于MySQL?B+樹(shù)索引與哈希索引的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03
mysql本地登錄無(wú)法使用端口號(hào)登錄的解決方法
這篇文章主要介紹了mysql本地登錄無(wú)法使用端口號(hào)登錄的解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
mysql 1130錯(cuò)誤,無(wú)法登錄遠(yuǎn)程服務(wù)的解決
這篇文章主要介紹了mysql 1130錯(cuò)誤,無(wú)法登錄遠(yuǎn)程服務(wù)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03

