MySQL查询去重是使用UNION还是使用DISTINCT
标签MySQL、SQL优化、去重、UNION、DISTINCT、UNION ALL、执行计划前言开发过程中经常面临数据去重需求大家常会纠结两种方案使用DISTINCT在单条结果集中完成去重使用UNION合并多条查询并自动去重。还有很多开发者分不清UNION和UNION ALL的巨大差异经常误用导致数据库出现不必要的性能消耗。本文对比两者原理、适用场景、性能差距给出线上环境选型标准。一、先理清基础语法与核心行为1. DISTINCT作用对单条SQL的结果集进行去重。SELECTDISTINCTuser_idFROMuser_login_logWHEREdateCURDATE();执行逻辑数据库取出所有满足条件的数据按照指定字段进行分组对比剔除重复行保留唯一记录。2. UNION 与 UNION ALL重点区分-- UNION合并结果 自动去重 排序SELECTuser_idFROMuserWHEREstatus1UNIONSELECTuser_idFROMapp_keyWHEREstatus1;-- UNION ALL仅简单纵向拼接**不去重、不排序**SELECTuser_idFROMuserWHEREstatus1UNIONALLSELECTuser_idFROMapp_keyWHEREstatus1;很多人踩坑以为 UNION UNION ALL二者性能差距极大。UNION UNION ALL DISTINCT 排序操作二、底层实现原理对比DISTINCT 原理在结果集内部构建临时内存哈希表或者排序缓冲区遍历数据消除本行内重复记录。数据量较小使用内存数据量大超过缓冲区限制则落地磁盘临时文件性能断崖下跌。UNION 原理分别执行前后两条子查询使用UNION ALL把所有数据纵向汇总全局执行一次DISTINCT排序去重。简单公式UNION UNION ALL DISTINCT三、核心性能结论如果业务需要合并多条SQL结果并且去重可以使用UNION如果多条SQL合并原始数据不存在重复优先使用UNION ALL不要用 UNION如果只是单表/单条查询内部去重不要使用 UNION直接使用DISTINCT杜绝滥用 UNION 实现单条SQL内部去重属于完全错误用法。四、场景分类实战分析场景1单条查询内部去除重复数据 ✅ DISTINCT需求查询当日登录日志里所有活跃用户ID同一用户多条登录记录只展示一次。-- 正确写法SELECTDISTINCTuser_idFROMuser_login_logWHEREdateCURDATE();-- ❌ 错误示范没必要强行拆分UNIONSELECTuser_idFROMuser_login_logWHEREdateCURDATE()UNIONSELECTuser_idFROMuser_login_logWHEREdateCURDATE();强行使用UNION会执行两次相同查询扫描双倍数据额外执行全局去重资源翻倍浪费。场景2多条独立查询结果合并需要全局去重需求从用户表、密钥表两处查询user_id合并结果同一个user_id只保留一条。方案A UNIONSELECTuser_idFROMuserWHEREusernamedemoUNIONSELECTuser_idFROMapp_keyWHEREaccess_keydemo_key;方案B UNION ALL 外层DISTINCTSELECTDISTINCTuser_idFROM(SELECTuser_idFROMuserWHEREusernamedemoUNIONALLSELECTuser_idFROMapp_keyWHEREaccess_keydemo_key)t;重点方案A 和方案B哪个更快绝大多数情况下UNION ALL 外层DISTINCT 性能 ≥ UNION原因UNION默认会附带排序行为而外层DISTINCT优化器可以选择哈希去重不一定强制排序优化空间更大。追求稳定高性能推荐统一使用UNION ALL DISTINCT写法避免UNION隐性排序带来开销。场景3多条查询合并明确不存在重复数据✅ 直接使用UNION ALL不要使用UNION不要额外加DISTINCT省去全局比较、排序、去重的巨大开销。SELECTidFROMuserLIMIT100UNIONALLSELECTidFROMapp_keyLIMIT100;五、高频误区汇总误区1UNION 和 DISTINCT 可以随意互相替换❌ 不能替换。DISTINCT作用于单查询内部UNION作用于多条查询合并之后适用场景边界完全不同。误区2UNION去重性能优于 UNION ALL DISTINCT❌ 恰恰相反。UNION强制执行排序去重UNION ALL只做拼接把去重选择权交给外层优化器拥有更多优化策略。误区3少量数据随便写无所谓在测试环境少量数据看不出差距当结果集上万、十万级别UNION额外排序会直接引发慢查询线上极易爆出性能故障。误区4不知道UNION自带排序导致不必要的消耗MySQL UNION规范合并完成后会执行排序操作如果你不需要排序不要使用UNION。六、索引层面额外优化提示DISTINCT查询尽量建立覆盖索引避免大量回表-- 示例利用索引直接完成去重无需读取原始数据表CREATEINDEXidx_date_userONuser_login_log(date,user_id);UNION ALL拆分多条查询时每条子查询务必保证可以正常命中索引如果最终只需要获取第一条匹配记录可以每层子查询增加 LIMIT 实现短路查询减少扫描行数。七、选型决策清单线上直接套用仅单条SQL内部去重→ 使用DISTINCT多条SQL结果合并存在重复且需要去重→ 优先UNION ALL 外层DISTINCT多条SQL结果合并确认无重复→ 使用UNION ALL禁止单条查询场景强行拆分使用UNION做去重禁止能用UNION ALL的场景随意使用UNION八、验证手段使用EXPLAIN观察执行计划UNION通常能看到Using temporary; Using filesort临时表文件排序UNION ALL没有全局排序与临时表执行计划更加简洁总结一句话去重工具没有绝对好坏分清场景再选择能使用 UNION ALL 就不要使用 UNION能避免全局排序就尽量避免。延伸业务小案例你项目常用场景根据账号、邮箱、密钥多条件检索用户ID-- 最优写法SELECTDISTINCTuser_idFROM(SELECTuser_idFROMuserWHEREusernamedemoUNIONALLSELECTuser_idFROMuserWHEREemaildemotest.comUNIONALLSELECTuser_idFROMapp_keyWHEREaccess_keydemo_key)tmp;相比直接写三条UNION性能更好也是线上检索场景标准写法。

相关新闻

深入解析TI N2HET指令集:从硬件定时器原理到汽车ECU实战编程

深入解析TI N2HET指令集:从硬件定时器原理到汽车ECU实战编程

1. 项目概述:为什么需要深入理解N2HET指令集?在汽车发动机控制单元(ECU)、电机驱动或者任何对时序有“变态级”要求的嵌入式实时系统中,通用CPU软件循环的“软定时”早就被淘汰了。这类场景下,我们需要的是…

2026/7/23 18:35:00阅读更多 →
线程同步——互斥和条件变量

线程同步——互斥和条件变量

文章目录1. 互斥锁1.1 互斥锁1.1.1 普通互斥锁加锁代码示例1.1.2 递归互斥锁1.3 自旋锁代码示例1.4 定时锁1.4.1 普通定时锁1.4.2 递归定时锁2 读写锁使用方法代码示例3. 锁保护3.1 lock_guard代码示例实现原理3.2 唯一锁4. 条件变量和消费者模式3.1 条件变量3.2 生产者消费者模…

2026/7/23 18:33:00阅读更多 →
【保姆级教程】小米路由器刷OpenWRT软路由系统并安装内网穿透配置公网地址

【保姆级教程】小米路由器刷OpenWRT软路由系统并安装内网穿透配置公网地址

文章目录前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理界面4.4 创建公网地址5. 固定公网地址访问前言 今天分享一下如何在小米路由器4A千兆…

2026/7/23 18:33:00阅读更多 →
DecoTV注册功能详解:临时开启与安全管理最佳实践

DecoTV注册功能详解:临时开启与安全管理最佳实践

DecoTV注册功能详解:临时开启与安全管理最佳实践 【免费下载链接】DecoTV 基于最新版LunaTV二次开发的一个开箱即用的、跨平台的影视聚合播放站。【原KatelyaTV】 项目地址: https://gitcode.com/gh_mirrors/de/DecoTV DecoTV作为一款基于LunaTV二次开发的跨…

2026/7/23 19:47:18阅读更多 →
为什么83%的AI项目在团队阶段失败?——拆解模型版本管理、数据权限、推理服务三大断点,立即修复

为什么83%的AI项目在团队阶段失败?——拆解模型版本管理、数据权限、推理服务三大断点,立即修复

更多请点击: https://codechina.net 第一章:为什么83%的 AI项目在团队阶段失败?——核心归因与破局逻辑 这一失败率并非来自技术不可行,而是源于跨职能协作断裂、目标对齐缺失与工程化能力断层。当数据科学家交付一个准确率达92%…

2026/7/23 19:47:18阅读更多 →
抖音运营正在消失?AI自动化接管内容策划、发布、互动、复盘全流程(仅剩最后37个高阶策略未开放)

抖音运营正在消失?AI自动化接管内容策划、发布、互动、复盘全流程(仅剩最后37个高阶策略未开放)

更多请点击: https://codechina.net 第一章:抖音运营正在消失?AI自动化接管内容策划、发布、互动、复盘全流程(仅剩最后37个高阶策略未开放) 抖音运营正经历一场静默革命:人工主导的“选题—脚本—拍摄—剪…

2026/7/23 19:47:18阅读更多 →
AI办公不是替代人,而是淘汰不会用AI的人:3类岗位正在消失,4类新角色年薪涨62%

AI办公不是替代人,而是淘汰不会用AI的人:3类岗位正在消失,4类新角色年薪涨62%

更多请点击: https://codechina.net 第一章:AI办公不是替代人,而是淘汰不会用AI的人 AI办公的本质不是让机器接管人类岗位,而是重塑人机协作的效率边界。当一名市场专员用自然语言指令在10秒内生成完整竞品分析报告,而…

2026/7/23 19:47:18阅读更多 →
用 FRP 自建内网穿透:家里设备随时随地安全访问

用 FRP 自建内网穿透:家里设备随时随地安全访问

家里 NAS 上的照片、软路由的管理页面、局域网里跑着的小服务,出门在外想访问一下,经常抓瞎。运营商不给公网 IP,路由器端口转发做不了,TeamViewer 之类的工具又慢又限制多。 折腾了一圈,最后留在手里的方案是 FRP&…

2026/7/23 19:47:18阅读更多 →
Linux僵尸进程全解

Linux僵尸进程全解

1、僵尸进程是什么?僵尸进程是 Linux 进程的一种特殊状态(Z状态)。它指的是一个已经执行完毕(terminated)的子进程,但其退出状态信息仍然保留在系统进程表中,等待其父进程来读取(rea…

2026/7/23 19:45:17阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/23 0:56:31阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/23 0:56:31阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 0:56:31阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:00:28阅读更多 →
从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:28阅读更多 →
油泥处理设备哪里能买到

油泥处理设备哪里能买到

油泥处理设备哪里有?这是许多从事油田、炼化、清罐业务的从业者最关心的问题。根据河南三丰环保设备有限公司的行业经验,选购油泥处理设备的核心在于设备能否适配当地环保法规与原料特性,而非单纯看价格。该公司总经理王钦田先生指出&#xf…

2026/7/23 0:00:28阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/22 22:56:18阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →