

新闻资讯
技术学院DISTINCT是对结果集整行去重的逻辑操作,实现方式包括基于排序(适合中小数据量)、基于哈希(高效但耗内存)和利用唯一索引(最优但依赖设计);其作用对象是SELECT列的组合值,非单列。
DISTINCT 并不是简单地“把重复行删掉”,而是数据库在查询执行过程中,对结果集进行去重处理的逻辑操作。它的实现机制取决于具体数据库系统、数据量大小、是否有索引、是否涉及排序以及是否启用哈希优化等因素。
这是最经典、兼容性最强的方式。数据库先将目标字段(或所有 SELECT 列)作为排序键,对中间结果进行排序,再顺序扫描,跳过与前一行完全相同的记录。
数据库构建一个哈希表,以 DISTINCT 字段值为 key,首次遇到的行(或仅存 key)写入哈希表;后续遇到相同 key 直接跳过。扫描结束后,哈希表中的所有 key 即为去重结果。
如果 DISTINCT 字段上有唯一索引(或联合索引前导列覆盖 DISTINCT 列),且查询不包含其他非索引列或复杂表达式,优化器可能直接走索引扫描,天然跳过重复——因为索引结构本身已保证唯一性。
SELECT DISTINCT user_id FROM orders WHERE status = 'paid',若 (status, user_id) 有联合索引,且 user_id 在该索引中不重复出现,则可能免排序/哈希很多人误以为 SELECT DISTINCT a, b FROM t 是分别对 a 和 b 去重。实际上,它是对 (a,b) 这个组合值 去重。只要任意一列不同,整行就视为不重复。
SELECT DISTINCT a FROM t
层机制。理解这些差异,有助于写出更可控、可优化的去重查询。