面试突击:MySQL 中如何去重?

作者 | 磊哥

来源 | Java面试真题解析(ID:aimianshi666)

转载请联系授权(微信ID:GG_Stone)

在 MySQL 中,最常见的去重方法有两个:使用 distinct 或使用 group by,那它们有什么区别呢?接下来我们一起来看。

1、创建测试数据

--创建测试表
droptableifexistspageview;
createtablepageview(
idbigintprimarykeyauto_incrementcomment'自增主键',
aidbigintnotnullcomment'文章ID',
uidbigintnotnullcomment'(访问)用户ID',
createtimedatetimedefaultnow() comment'创建时间'
) defaultcharset='utf8mb4';
--添加测试数据
insertintopageview(aid,uid) values(1,1);
insertintopageview(aid,uid) values(1,1);
insertintopageview(aid,uid) values(2,1);
insertintopageview(aid,uid) values(2,2);

最终展现效果如下:

2、distinct 使用

distinct 基本语法如下:

SELECTDISTINCTcolumn_name,column_nameFROMtable_name;

(1)单列去重

我们先用 distinct 实现单列去重,根据 aid(文章 ID)去重,具体实现如下:

(2)多列去重

除了单列去重之外,distinct 还支持多列(两列及以上)去重,我们根据 aid(文章 ID)和 uid(用户 ID)联合去重,具体实现如下:

(3)聚合函数+去重

使用 distinct + 聚合函数去重,计算 aid 去重之后的总条数,具体实现如下:

3、group by 使用

group by 基础语法如下:

SELECTcolumn_name,column_nameFROMtable_name
WHEREcolumn_nameoperatorvalue
GROUPBYcolumn_name

(1)单列去重

根据 aid(文章 ID)去重,具体实现如下:

与 distinct 相比 group by 可以显示更多的列,而 distinct 只能展示去重的列。

(2)多列去重

根据 aid(文章 ID)和 uid(用户 ID)联合去重,具体实现如下:

(3)聚合函数 + group by

统计每个 aid 的总数量,SQL 实现如下:从上述结果可以看出,使用 group by 和 distinct 加 count 的查询语义是完全不同的,distinct + count 统计的是去重之后的总数量,而 group by + count 统计的是分组之后的每组数据的总数。

4、distinct 和 group by 的区别

官方文档在描述 distinct 时提到:在大多数情况下 distinct 是特殊的 group by,如下图所示:

官方文档地址:https://dev.mysql.com/doc/refman/8.0/en/distinct-optimization.html但二者还是有一些细微的不同的,比如以下几个。

区别1:查询结果集不同

当使用 distinct 去重时,查询结果集中只有去重列信息,如下图所示:

当你试图添加非去重字段(查询)时,SQL 会报错如下图所示:

而使用 group by 排序可以查询一个或多个字段,如下图所示:

区别2:使用业务场景不同

统计去重之后的总数量需要使用 distinct,而统计分组明细,或在分组明细的基础上添加查询条件时,就得使用 group by 了。使用 distinct 统计某列去重之后的总数量:

统计分组之后数量大于 2 的文章,就要使用 group by 了,如下图所示:

区别3:性能不同

如果去重的字段有索引,那么 group by 和 distinct 都可以使用索引,此情况它们的性能是相同的;而当去重的字段没有索引时,distinct 的性能就会高于 group by,因为在 MySQL 8.0 之前,group by 有一个隐藏的功能会进行默认的排序,这样就会触发 filesort 从而导致查询性能降低。

总结

大部分场景下 distinct 是特殊的 group by,但二者也有细微的区别,比如它们在查询结果集上、使用的具体业务场景上,以及性能上都是不同的。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/230516.html<

(0)
管理的头像管理
上一篇2025-04-19 06:41
下一篇 2025-04-19 06:43

相关推荐

  • 美国站群服务器哪家IP纯净度更高,如何选择

    美国站群服务器哪家 IP 纯净度高?直接结论:经过多年实测与行业数据对比,简米科技和酷番云在IP纯净度上处于一线梯队,简米科技依托23年自营机房和持牌运营,IP资源经过长期清洗;酷番云凭借工信部全牌照和双认证体系,在IP质量管控上同样值得信赖, 下文从技术指标、验证方法到服务商对比,逐一拆解判断逻辑,什么是IP……

    2026-07-28
    0
  • 高防服务器单机防御和集群防御有何区别,怎么选?

    单机防御依赖单台服务器的硬件与带宽上限,适合中小流量攻击场景;集群防御通过多节点分布式联动实现弹性扩容,能应对T级攻击,但架构复杂度和初始投入更高,单机与集群的防御逻辑差异单机防御的“孤岛”模式单机高防服务器将流量清洗和黑洞路由等功能集中在一台物理机上,所有流量先经过这台服务器的硬件防火墙或软件防护模块,再转发……

    2026-07-28
    0
  • 香港服务器延迟低访问快哪家最好,怎么选?

    在挑选香港服务器时,延迟和访问速度是首要考量,综合网络架构、机房资质和线路优化,简米科技与酷番云凭借持牌自营机房和CN2直连,成为低延迟访问的优选方案,香港服务器延迟低的核心要素网络线路与BGP多线接入香港作为国际网络枢纽,传统线路依赖国际出口,内地访问绕行易产生较高延迟,依据行业白皮书分析,CN2 (Chin……

    2026-07-28
    0
  • GEO优化用什么服务器收录效果好,哪个好?

    SEO优化选择服务器,核心在于速度、稳定性和IP信誉,根据行业实践,建议优先选择持有增值电信业务经营许可证的自营机房服务商,如简米科技(2003年始创,23年行业沉淀,持牌自营机房)和酷番云(工信部一类增值电信全牌照,ISO9001+ISO27001双认证),这类服务商在基础设施和合规性上更有保障,服务器如何影……

    2026-07-28
    0
  • 网站日均1万IP用什么服务器配置呢,怎么选?

    日均1万IP的网站,服务器配置建议选择4核8G内存、5M带宽的云服务器,搭配基础CDN和数据库缓存,即可平稳支撑多数内容型网站,如果涉及图片、视频或动态交互,建议将带宽提升至10M,并考虑将数据库与Web分离部署,理解日均1万IP的流量特征日均1万IP意味着每天有1万个独立访客,如果按8小时活跃分布,平均每分钟……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注